При установке обновлений для приложения или плагина часто востребованной задачей является внесение изменений в структуру базы данных или удаление более не актуальных файлов из директории приложения либо плагина, либо конфигурационных файлов продукта. Такие действия, напрямую не относящиеся к изменению файлов с исходным кодом продукта, называются метаобновлением.
Для автоматического выполнения метаобновлений очередная версия продукта должна содержать правильно оформленные PHP-файлы с требуемой логикой (для выполнения SQL-запросов, удаления лишних файлов и т. п.).
Правила оформления исходного кода файлов метаобновлений
- Имя файла (с расширением
.php
) должно представлять собой метку времени UNIX, соответствующую более позднему времени, чем время установки текущей (еще не обновленной) версии продукта. Пример правильного имени файла:1383820487.php
. - Файлы с исходным кодом метаобновлений должны находиться в директории
lib/updates/
либо в любой поддиректории внутриlib/updates/
. Например, файлы метаобновлений каждого нового поколения продукта может быть целесообразным хранить в отдельной поддиректории:lib/updates/1/
,lib/updates/2/
,lib/updates/3/
и т. п. - В файлах метаобновлений можно использовать любые классы фреймворка и обновляемого приложения.
-
Файлы метаобновлений должны быть написаны таким образом, чтобы их исходный код мог быть выполнен любое количество раз без негативных последствий. Потенциально невыполнимые операции рекомендуется обрабатывать с помощью блока
try...catch
, чтобы исключить возможность прерывания выполнения скрипта.Пример:
<?php $model = new waModel(); //попытка получить содержимое потенциально отсутствующего поля таблицы try { $model->query('SELECT sort FROM myapp_item WHERE 0'); //в случае неудачи — если поле отсутствует — добавляем его в таблицу } catch (waDbException $e) { $sql = 'ALTER TABLE myapp_item ADD sort INT(11) NOT NULL DEFAULT 0'; $model->exec($sql); }
Как происходит выполнение метаобновлений
При первом запуске продукта после установки обновлений с помощью «Инсталлера» проверяется значение записи с именем update_time
для данного продукта в таблице wa_app_settings
. После этого в хронологическом порядке начинает по очереди выполняться исходный код файлов метаобновлений продукта, в именах которых метка времени превышает значение, полученное из базы данных. Если исходный код какого-либо файла метаобновлений не выполнится, то исходный код остальных файлов также выполнен не будет. После успешного завершения метаобновления автоматически обновляется значение update_time
в базе данных с текущей меткой времени.