Загрузка PHP-скриптов в живую среду - PullRequest
3 голосов
/ 02 февраля 2011

У меня есть приложение PHP, которое требует частых обновлений кода.Что я делаю сейчас, так это то, что я отключаю приложение для обслуживания всякий раз, когда мне нужно загрузить новые скрипты, эффективно отключая приложение для всех пользователей, кроме меня самого.

Если я не делаю этого, я всегда вижу много«неожиданных $ end» сообщений об ошибках в журналах, поскольку PHP пытается интерпретировать наполовину загруженные скрипты.Чего я, конечно, хочу избежать.

Мой вопрос: есть ли безопасный способ сделать это, не отключая приложение для обслуживания?В среде с большим количеством одновременных пользователей будет ли загрузка во временный каталог и затем перемещение файлов локально на сервере достаточно быстрой, чтобы избежать этих ошибок?Можно ли его как-нибудь автоматизировать для удобного рабочего процесса?

Спасибо!

Ответы [ 5 ]

6 голосов
/ 02 февраля 2011

Я думаю, что хорошей практикой является создание проверки для новой версии (вы должны использовать систему контроля версий), и после того, как все на своем месте, просто символическая ссылка на новый каталог, например:

До обновления:

/live => Symlink to /release-2011-02-01

После обновления:

/live => Symlink to /release-2011-02-02

Затем через некоторое время вы можете очистить старые выпуски.

2 голосов
/ 02 февраля 2011

Один очень упрощенный подход, который работает с FTP, состоит в том, чтобы иметь две директории:

/site_live
/site_shadow

при появлении новой версии загрузите ее на site_shadow. Когда это будет сделано, переименуйте site_live в site_shadow и наоборот.

Это работает нормально и без перерывов; если вы храните какие-либо пользовательские данные в приложении, вам также придется перемещать эти каталоги.

Расширенная версия работает с номерами версий из вашего программного обеспечения для контроля версий, сохраняя каждую ревизию в определенном каталоге.

/site_live 
/site_101
/site_102
/site_106

Вместо переименования каталогов, подход symlink, показанный @schneck, является лучшим, если он доступен в вашей среде!

0 голосов
/ 02 февраля 2011

Существует множество способов уменьшить проблему - большинство других ответов сводятся к созданию локального зеркала сайта, внесению изменений и затем переключению зеркала вместо живого кода. По сути, они просто сокращают время, необходимое для записи новых файлов, - на самом деле они не устраняют проблему. например Предположим, у вас есть 20 файлов для обновления, а для файла в верхней части списка требуется один файл из нижней части списка?

Я предполагаю, что это управляемая служба - VPS или выделенный / общий хост - это исключает возможность передачи доступного IP-адреса на другой узел кластера во время операции обновления файла. Этот подход может полностью устранить простои, если у вас нет зависимостей от общей подложки хранилища (например, обработка слипающихся сессий, структура базы данных).

Возможно приостановить активность до некоторой степени, используя сценарий автоматического добавления, пока операция завершается, что-то вроде ......

<?php

if (file_exists('/somewhere/uploading_new_content')) {
     // following should be implemented as a seperate file
     // which is only included when necessary....
     $targettime=30; // assuming the update takes 30 seconds....
     $sleeptime=$targettime - time() + filemtime('/somewhere/uploading_new_content');
     sleep($sleeptime);
     print "Sorry - Your request was paused due to essential maintenance<br />\n";
     $dest=$_SERVER['REQUEST_URI'];
     if (count($_POST)) {
         print "<form method='POST' action='$dest'>";
         foreach ($_POST as $key=>$val) {
             $val=htmlentities($val);
             $key=htmlentities($key);
             print "<input type='hidden' name='$key' value='$val'>\n";
         }
         print "<input type='submit' name='uploading_pause' value='continue'>\n";
         print "</form>\n";
     } else {
         print "<a href='$dest'>continue</a>";
     }
     exit;
}
0 голосов
/ 02 февраля 2011

Я думаю, что самый безопасный способ сделать это - создать теневую копию вашего сайта для тестирования среды.

У вас будет отдельный поддомен, например:

http://dev.mysite.com

, для которого требуется HTTP-аутентификация и IP-проверка, чтобы никто не имел к этому доступа, вы должны создать сценарий миграции, который будет обрабатывать процесс перемещения файлов из dev в основной оперативный каталог.

То, как я бы это сделал, выглядит следующим образом:

  • Инициируйте режим обслуживания в реальном времени, чтобы
  • Запустить сценарий миграции
  • Проверить черезсайт, на котором новый код вступает в силу
  • удалить режим обслуживания

Сценарий миграции не сложен, в основном это скрипт, который будет выполнять следующее:

  • Резервное копирование вашего живого сайта в секретное местоположение
  • Рекурсивно выкидывало структуру каталогов для живого сайта несколько раз
    • Первая итерация: если файл существует on dev, но не в реальном времени, затем скопируйте туда файл
    • Вторая итерация: если файл существует в dev и в реальном времени, то проверьте хеши md5 и последние измененные метки времени, чтобы увидеть файл, следует перезаписать.
    • Третья итерация: создайте файл суммы md5, который будет использоваться для следующего обновления.
  • Затем вы соответственно измените свои ревизии.

СборкаПодобный процесс прост, но требует некоторой работы, создание административной панели, которая поможет с этим, действительно облегчит вашу жизнь.


После публикации моего ответа я бы посоветовал вам перейти с Ответ @ schneck гораздо более управляемый.

0 голосов
/ 02 февраля 2011

Если вам часто нужно обновлять скрипты, то в вашем приложении есть недостаток дизайна. Вы можете изменить скрипт, только если в нем есть ошибка. Требуется серьезное обновление, если вы хотите полностью пересмотреть приложение.

Если изменения являются каждодневными изменениями (скажем, цена Предмета для EShop), то вы должны поддерживать какую-то таблицу базы данных и обновлять эти значения, предотвращая необходимость обновления скрипта.

С этого момента вы можете подумать о редизайне своего приложения, помня об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...