Я пишу CMS на PHP + MySQL. Я хочу, чтобы он был самовосстанавливающимся (запустите один клик в панели администратора). Каковы наилучшие методы?
Как сравнить текущую версию cms и версию обновления (самого приложения и базы данных). Должен ли он просто загружать zip-архив, увеличивать его и перезаписывать файлы? (но что делать с файлами, которые больше не используются). Как проверить, правильно ли загружено обновление? Также он поддерживает модули, и я хочу, чтобы эти модули можно было загрузить из панели администрирования cms.
И как мне обновлять таблицы MySQL?
Несколько более экспериментальное решение может состоять в том, чтобы использовать что-то вроде библиотеки phpsvnclient .
С функциями:
Таким образом вы можете увидеть, есть ли новые файлы, удаленные файлы или обновленные файлы и только изменить их в локальном приложении.
Я считаю, что это будет немного сложнее реализовать, но, вероятно, преимущество будет заключаться в том, что проще и быстрее добавлять обновления в вашу CMS.
Если вы сделаете это, самым простым было бы полностью загрузить новую версию (без инкрементных патчей) и разархивировать ее в каталог, соседний с тем, который содержит текущую версию. Поскольку в каталоге кода не будут переменные файлы, вы можете просто удалить или переименовать старый и переименовать новый, чтобы заменить его.
Вы можете сохранить номер версии в глобальной константе в коде.
Что касается MySQL, нет другого способа, кроме создания сценария обновления для каждой версии, которая изменяет макет базы данных. Даже автоматические решения для изменения определения таблицы не могут знать, как обновлять существующие данные.
Существует SQL-библиотека под названием SQLOO (которую я создал), которая пытается решить эту проблему. Это немного грубо, но основная идея заключается в том, что вы настраиваете схему SQL в PHP-коде, а затем SQLOO меняет текущую схему базы данных на соответствие коду. Это позволяет сменить схему SQL и вложенный PHP-код вместе и на гораздо меньшие фрагменты.
http://code.google.com/p/sqloo/
http://code.google.com/p/sqloo/source/browse/#svn/trunk/example <- примеры
У вас есть два сценария:
Это просто диктует, если вы будете декомпрессировать ZIP-файл или использовать FTP для обновления файлов. В простом эфире ваш первый шаг – взять дамп базы данных и резервную копию существующих файлов, чтобы пользователь мог откатиться, если что-то пошло ужасно неправильно. Как говорили другие, важно сохранить все, что пользователь, скорее всего, настроит вне сферы обновления. WordPress делает это красиво. Если пользователь внес изменения в основной логический код, они, вероятно, достаточно умны, чтобы разрешать конфликты слияния сами по себе (и достаточно умны, чтобы знать, что обновление с одним кликом, вероятно, потеряет свои модификации).
Ваш второй шаг – убедиться, что ваш скрипт не умирает, если браузер закрыт. Это процесс, который действительно не должен прерываться. Вы можете выполнить это через ignore_user_abort(true);
, или некоторые другие средства. Или, если хотите, разрешите пользователю установить флажок «Продолжайте движение, даже если я отключусь». Я предполагаю, что вы будете обрабатывать ошибки внутри.
Теперь, в зависимости от разрешений, вы можете:
Тогда вы готовы:
en situ
или на месте. Вы можете:
Самый важный аспект – убедиться, что вы можете отменить изменения, если ситуация пойдет не так. Другое дело, чтобы убедиться, что если вы используете / tmp, обязательно проверьте разрешения своей промежуточной области. 0600
должно хорошо.
Посмотрите, как WordPress и другие делают это. Если ваш выбор лицензий и их согласие, вы даже можете повторно использовать часть этого кода.
Удачи с вашим проектом.
Основываясь на опыте работы с несколькими приложениями, CMS и другими, это общая схема:
Я согласен с ответом Барта ван Хекелома , это самый обычный способ сделать это.
Единственный другой вариант – превратить вашу CMS в кучу удаленных веб-сервисов / скриптов и внешних файлов CSS / JS, которые вы размещаете только в одном месте.
Тогда все, кто использует вашу CMS, будут подключаться к вашему центральному «серверу CMS», и все, что будет на их (вызывающем) сервере, – это куча скриптов для вызова ваших веб-сервисов / скриптов, которые выполняют всю обработку и вывод. Если вы поехали по этому маршруту, вам нужно будет идентифицировать / аутентифицировать каждый запрос, чтобы вы вернули соответствующие данные для данного пользователя CMS.