В настоящее время довольно стандартная практика для самообновления настольных приложений. На Mac каждая программа, не использующая Apple, которая использует Sparkle в моей книге, является мгновенной победой. Для разработчиков Windows это уже обсуждалось подробно . Я еще не нашел информацию о самообновляющихся веб-приложениях, и надеюсь, что вы сможете помочь.
Я создаю веб-приложение, предназначенное для установки как WordPress или Drupal – разархивируйте его в каталог, нажму на какую-то страницу установки и он готов к работе. Чтобы иметь широкую совместимость с сервером, меня попросили использовать PHP и MySQL – это MP? В любом случае он должен быть широко-кросс-платформенным. Для контекста это в основном унифицированное приложение для веб-сообщений для малого бизнеса. Это не другая платформа CMS, подумайте о веб-почте.
Я хочу знать о самообновляющихся веб-приложениях. Прежде всего, (1) это плохая идея? Начиная с WordPress 2.7, автоматическое обновление – это единственная кнопка, которая кажется легкой, и все же я могу представить себе так много способов, которые это могло бы пойти ужасно, ужасно неправильно. Кроме того, разве идея не в том, что веб-файлы могут быть перезаписаны веб-процессом в виде дыры в безопасности?
(2) Стоит ли время разработки? Вероятно, в мире есть миллионы установок WP, поэтому, вероятно, стоит потратить время, чтобы команда WP упростилась, экономя миллионы человеко-часов по всему миру. Я могу только представить несколько тысяч установок моего программного обеспечения – строит самообеспечение, которое стоит времени на инвестиции, или я могу предположить, что пользователи, достаточно усложненные для загрузки и установки веб-программного обеспечения, в первую очередь, могут пройти контрольный список обновлений?
Если это не катастрофа безопасности или трата времени, то (3) я ищу предложения от тех, кто сделал это раньше. Вы сохраняете таблицу версий в своей базе данных? Как вы управляете обновлениями БД? Какой метод вы используете для отката частичного обновления в контексте самообновляющегося веб-приложения? С помощью слоя ORM стало проще или сложнее? Вы держите дельту изменений в версии, или вы просто каждый раз взрываете все это?
Я ценю ваши мысли по этому поводу.
Честно говоря, это действительно зависит от вашей пользовательской базы. Существует множество приложений PHP, которые не обновляются автоматически автоматически. Их пользователи либо достаточно технические, чтобы обрабатывать процесс обновления, либо просто не обновлять.
Я делаю два шага:
1) Серьезно спросите себя, что вам действительно нужно пользователям. Будет ли самообновление обеспечить достаточный импульс для принятия, чтобы оправдать дополнительную работу? Если вы уверены, что ответ «да», просто сделайте это.
Поскольку вы спрашиваете здесь, я бы предположил, что вы еще не знаете. В этом случае я назначаю шаг 2:
2) Отпустите версию 1.0 без функции. Дождитесь обратной связи с пользователем. Ваши пользователи могут сразу плакать за более простой процесс обновления, и в этом случае вы должны определить приоритет. Кроме того, вы можете обнаружить, что ваши пользователи гораздо больше интересуются некоторыми другими функциями.
Угадайте, чего хотят ваши пользователи, не спрашивая их, это хороший способ потратить много времени на то, что людям действительно не нужно.
Я думал об этом в последнее время в отношении изменений схемы базы данных. На данный момент я копаю в WordPress, чтобы посмотреть, как они обрабатывают изменения базы данных между версиями. Вот что я нашел до сих пор:
$wp_db_version
загружается из wp-includes/version.php
. Эта переменная соответствует номеру версии Subversion и обновляется при изменении wp-admin/includes/schema.php
. (Возможно, с помощью крючка? Я не уверен.) Когда загружается wp-admin/admin.php
, из базы данных считывается опция WordPress с именем db_version
. Если это число не равно $wp_db_version
, $wp_db_version
wp-admin/upgrade.php
.
wp-admin/includes/upgrade.php
включает функцию dbDelta()
. dbDelta()
сканирует $wp_queries
(строку SQL-запросов, которая будет создавать самую последнюю схему базы данных с нуля) и сравнивает ее с схемой в базе данных, изменяя таблицы по мере необходимости, чтобы схема была обновлена.
Затем upgrade.php
запускает функцию под названием upgrade_all()
которая запускает определенные функции upgrade_NNN()
если $wp_db_version
меньше целевых значений. (то есть upgrade_250()
, обновление WordPress 2.5.0, будет запущено, если версия базы данных будет меньше 7499.) Каждая из этих функций выполняет свои собственные миграции данных и процедуры популяции, некоторые из которых вызывается во время начальной настройки базы данных скрипт. Красиво сокращает дублирующий код.
Итак, это один из способов сделать это.
Да, это была бы функция безопасности, если бы PHP пошел и перезаписал свои файлы из какого-либо места в Интернете без предупреждения. Нет никакой гарантии, что сервер правильно подключается к вашему серверу обновлений (он может загрузить какой-то код, созданный кем-то другим, если произошло заражение DNS) – предоставление кому-то другому доступа к данным вашего клиента. Поэтому цифровое подписание было бы важным.
Пользователь может управлять обновлениями, устанавливая разрешения в веб-каталоге, чтобы PHP имел доступ только к чтению файлов – эта процедура может быть просто документирована с вашей программой.
Остается один вопрос (я действительно не знаю ответа): может ли PHP перезаписывать файлы, если он в настоящее время их использует (например, если необходимо обновить файл update.php)? Стоит тестировать.
Я полагаю, вы уже приняли это решение, но вы можете разместить его как услугу. (Think wordpress.com)
Я предлагаю вам упаковать приложение с грушей и настроить канал . Затем ваши пользователи могут обновить приложение через стандартный интерфейс (груша). Это не полностью автоматическое (если у пользователей нет какой-либо автоматизации, работающей поверх груши), но она стандартная, поэтому любой системный администратор может ее поддерживать.
Я думаю, что ваш лучший вариант – это механизм проверки обновлений, который будет предупреждать администратора о появлении обновлений.
Как вы помните, существует ряд потенциальных проблем безопасности. Из-за этого я предлагаю не делать этого. Вместо этого попробуйте создать довольно умный сценарий обновления.
Только мои 2 цента: я бы рассмотрел приложение автоматической самообучения в своей CMS как дыру в безопасности, поэтому, если вы решите закодировать эту функцию, вам следует рассмотреть возможность реализации различных уровней этого поведения: