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