Готовое решение в проекте - установка, вмешательство, удаление
Ставим чужое решение так, чтобы через месяц знать, что именно оно делает с проектом, и уметь его убрать.
Решение
Проходим установку на копии сайта:
# копия базы и файлов до установки - это и есть план откатаmysqldump --single-transaction -u user -p base | gzip > /backup/pre-install.sql.gz# на копии проверяют: главная, каталог, оформление заказа, обмен с учётной системой# и замеряют время ответа до и после установкиУстановка меняет и файлы, и базу. Откат на боевом сайте после неудачной установки стоит дороже, чем час на стенде, а список проверок нужен один и тот же.
Смотрим, что уже установлено:
foreach (glob($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/*', GLOB_ONLYDIR) as $dir) { $id = basename($dir); if (str_contains($id, '.')) { // у сторонних решений в имени всегда точка $on = \Bitrix\Main\ModuleManager::isModuleInstalled($id) ? 'установлен' : 'лежит рядом'; printf("%-30s %s\n", $id, $on); }}Установленное решение и лежащий рядом каталог - разные вещи. Второе встречается после неудачных установок и переносов, и такой каталог годами вводит в заблуждение того, кто разбирается в проекте.
Находим, куда решение вмешалось:
$manager = \Bitrix\Main\EventManager::getInstance();foreach ($manager->findEventHandlers('main', 'OnBeforeProlog') as $handler) { printf("%s: %s\n", $handler['TO_MODULE_ID'], $handler['TO_NAME']);}// то же самое смотрят по событиям каталога, заказов и пользователейРешение вмешивается в проект подпиской на события. Обработчик на событии, которое случается на каждой странице, и есть самое частое объяснение внезапно подешевевшей скорости сайта.
Убираем решение и его следы:
1. Удаление модуля из административной части2. Проверка своих таблиц решения: часть удаляется, часть остаётся3. Настройки решения в опциях модуля4. Файлы: шаблоны компонентов, загрузки, свои каталогиУдаление модуля не всегда убирает его данные. Автор решения сам решает, что чистить, и таблицы с настройками нередко остаются жить в базе ещё несколько лет.
Ставить решение стоит по одному за раз, с проверкой между установками. Два решения, поставленные подряд, при поломке дают ровно один вопрос: которое из них, и ответ на него ищется дольше самой установки.
Правки в файлах чужого решения живут до его обновления. Нужное поведение получают своим кодом на его событиях, а не правкой файлов внутри чужого каталога.
Список установленных решений полезно держать в описании проекта. Через год никто не помнит, зачем ставилось третье, а удалять неизвестное страшно всем.
Решение стоит оценивать не только по цене, но и по тому, что придётся делать самому при его отказе. Готовый обмен, встроенный в половину сценариев магазина, однажды окажется тем местом, откуда его уже не вынуть без переписывания.
Типичные проблемы
После установки сайт перестал открываться.
Обработчик решения падает на общем событии каждой страницы. Такое решение отключают и разбирают уже на копии сайта.
Сайт стал заметно медленнее без видимой причины.
Решение подписалось на событие, которое случается при каждом обращении. Список подписок смотрят по событиям ядра.
Два решения спорят за один компонент.
Оба положили свой шаблон или свой класс на одно и то же место. Побеждает то, что подключилось последним.
Решение перестало обновляться.
Закончилась подписка на обновления или автор бросил решение. Дату последнего обновления смотрят до покупки.
После удаления решения в базе остались его таблицы.
Удаление модуля чистит только то, что предусмотрел автор. Остальное убирают руками по списку.
Частые вопросы
Как быстро отключить решение при поломке?
Удалением модуля из административной части или возвратом копии. Правка его файлов вслепую делает только хуже.
Что проверить до покупки?
Поддерживаемые версии продукта, дату обновления и отзывы. Заброшенное решение однажды не переживёт обновление ядра.
Можно ли править файлы чужого решения?
Правки исчезнут при его обновлении. Своё поведение получают своим кодом на событиях решения.
Как понять, что тормозит именно решение?
Замером до установки и после неё на одной и той же странице. Без первого замера сравнивать не с чем.
Смежное
-
Готовые решения - оглавление подтемы
-
Свой модуль не устанавливается: разбор причин - когда решение не ставится вовсе
-
Свой модуль: структура, установка, автозагрузка классов - как то же самое устроено изнутри
-
Приёмка чужого проекта: инвентарь, правки ядра, карта рисков - поиск чужих решений во всём проекте
-
Обработчик события: регистрация, аргументы, отмена действия - чем решение вмешивается в проект
-
Обновление продукта: подготовка, порядок, откат - обновления ядра и решений
-
Модули и решения - устройство модулей целиком
-
Наследование чужого компонента: расширить, не копируя - как расширять чужое без правок
-
Обновление сторонних решений: совместимость, проверка, откат - что будет с ним дальше
-
Мастер настройки сайта: тиражные решения - как устроены готовые сайты
-
Публикация своего модуля: требования, обновления, поддержка - та же история со стороны автора
-
Редакция продукта: ограничения, переход на старшую, ключ - требования решения к модулям редакции
-
Сайт сломался после установки решения: разбор причин - что делать, когда сайт лёг после установки
-
Решение изнутри: файлы, следы, вмешательство - что именно решение кладёт в проект