Мне иногда приходится вносить некоторые изменения в веб-сайт в понедельник в 00:00. Это очень маленькие возмещения, такие как изменение изображения или слова.
Сайт построен с использованием PHP и не использует базу данных.
Было бы очень неприятно делать это вручную посреди ночи, поэтому я использую время эпохи и оператор If примерно так:
<img src="/
<?php
$timestamp=time();
if ($timestamp<1433769105) {
echo "image1.jpg";
}
else {
echo "image2.jpg";
}
?>
">
Это делает свою работу, но представьте, что 20 таких кусков кода разбросаны по нескольким php-файлам. Это не выглядит профессионально на всех. Не говоря уже о времени, потраченном на их удаление.
Я ищу альтернативу этому подходу, но, похоже, ничего не придумаю. Я открыт для любых предложений.
Для вас может быть полезно написать службу развертывания на отдельном сервере, который может запланировать загрузку по FTP (с помощью задания cron) на понедельник 00:00. Вы можете использовать Raspberry Pi для этого, если хотите сэкономить немного денег 🙂
Для дальнейшей проработки, сервер (или Pi) может хранить копию ваших новых файлов, готовых к загрузке, и вашу информацию FTP, готовую к загрузке. Затем вы можете написать bash-скрипт для загрузки новых файлов через FTP-данные на ваш веб-сервер.
Затем вы просто создаете задание cron для запуска скрипта bash в понедельник 00:00. Расслабьтесь и отдохните, зная, что ваш новый код будет на вашем сервере, пока он находится в сети и будет доступен для получения файлов в понедельник 00:00 по FTP.
Чтобы развернуть сценарий развертывания, вы можете добавить запись в журнал, чтобы вы могли проснуться на следующее утро и просмотреть журналы развертывания, чтобы увидеть, пропущены ли какие-либо файлы или что-то пошло не так.
Надеюсь это поможет!
Я бы положил migrations
куда-нибудь в папку и ставить миграции вроде
<?php
// when the time has come
if (time() > strtotime())
{
// do the changes you wanted to make
rename("image1.jpg", "image2.jpg");
// move this migration into the done folder so
// that it doesn't get executed once more
rename(PHP_SELF, __DIR__."/done/".PHP_SELF);
}
Затем вы просто включаете все файлы из папки миграции. Затем каждая миграция проверяет, должна ли она быть выполнена.
// include all files in migrations
foreach (new DirectoryIterator('migrations') as $script)
{
if ($script->isFile() && substr($script, -4) === '.php')
include 'migrations/' . $script;
}
альтернативно вставьте метку даты / времени в имя миграции и выполняйте ее, только если пришло время:
2015-06-09.php
или же 1433800800.php
<?php
rename("image1.jpg", "image2.jpg");
В вашем index.php
// include all files in migrations
foreach (new DirectoryIterator('migrations') as $script)
{
// only execute *.php files
if (! $script->isFile() || substr($script, -4) !== '.php')
continue;
// extract date
$date = substr($script, 0, -4);
// convert string dates to timestamp
// if they are not timestamps already
if (! is_numeric($date))
$date = strotime($date);
// time has come?
if (time() >= $date)
{
require 'migrations/' . $script;
// move out of migrations folder so that it
// doesn't get executed once more
rename('migrations/' . $script, 'migrations/done/' . $script);
}
}