Евгений Росляков взял на постоянное сопровождение сайт городского новостного портала: привёл в порядок сервер LAMP, публичную часть на CakePHP, редакционную админку на Zend и шаблоны Smarty, а старые скрипты импорта на PHP/Perl починил и покрыл проверками. Сайтами он занимается с 2016 года, оформлен как самозанятый, заключает договор и выдаёт юридическим лицам закрывающие документы. Работает из Москвы и удалённо.
Портал выходит в небольшом городе, редакция там из нескольких человек. Сайт написан в 2012 году. Публичная часть сделана на CakePHP второй ветки, редакторы публикуют материалы через админку на Zend Framework 1, страницы собираются из шаблонов Smarty. Новости от партнёров и прогноз погоды подтягивают скрипты на Perl, которые запускает cron.
Сервер под всем этим годами не обновляли. В дни больших новостей читатели приходили все разом: перекрыли трассу, отключили воду, начался городской праздник. Сайт падал, и редакция теряла самую большую аудиторию именно в эти часы.
Создание сайта в 2012 году делал другой подрядчик, а теперь редакция искала человека, который будет заниматься порталом постоянно. Переписывать всё с нуля не хотели: денег нет, а к админке редакторы привыкли. Задача звучала так: остановить падения, защитить данные и составить план обновления небольшими шагами, не закрывая сайт на месяцы.
Для начала я прочитал код и осмотрел сервер: какие версии стоят, что запускается по расписанию, где лежат файлы и какие места падают первыми.
Начал с аудита. Выписал всё, что есть на сервере: версии PHP и Apache, расширения, задания cron, размеры таблиц, самые тяжёлые запросы. Выяснилось, что главная страница и ленты рубрик каждый раз собирались заново прямо из базы. Именно они и укладывали сервер в пиковые часы.
Потом занялся самим LAMP. Обновил операционную систему, Apache, MySQL и PHP. Код времён PHP 5 новые версии без правок не терпит, поэтому часть пришлось менять руками: устаревшие функции работы с базой, короткие теги, неявные преобразования типов. CakePHP и Zend я проверял страницу за страницей на копии сервера и только потом переключил боевой сайт.
Тяжёлые страницы закешировал. Главная и рубрики хранятся готовыми и пересобираются, когда редактор публикует материал или проходит короткий срок. В день большой новости читатель получает уже собранную страницу, и база почти не нагружается.
Отдельная история с импортом. Скрипты на Perl падали молча: партнёр менял формат ленты, и новости просто переставали приходить. Я аккуратнее переписал разбор файлов, добавил проверку формата и письмо редактору на случай, если лента не пришла. Связку PHP/Perl не трогал: Perl кладёт данные в таблицу, PHP их показывает. Для разбора лент и погоды написал тесты на примерах реальных файлов, включая битые.
Шаблоны Smarty почистил: убрал дубли блоков, мёртвые условия и куски, которые никто не выводил. Страницы стали легче, править их проще.
Настроил ежедневные резервные копии базы и файлов и проверил, что копию можно развернуть. Добавил мониторинг: если сайт не отвечает или главная открывается слишком долго, сообщение приходит мне и редактору.
В конце составил план постепенного обновления. Сначала админка на Zend Framework 1 переедет на поддерживаемого преемника (Laminas), потом по одному разделу уйдёт CakePHP. Каждый шаг делается отдельно, пока сайт работает.
В день больших новостей портал остаётся на ногах. Первая такая проверка случилась через пару месяцев после работ: читатели хлынули на материал о перекрытии дороги, главная открывалась как обычно, а редакция узнала о нагрузке из мониторинга, а не от возмущённых читателей.
Редакторы сидят в прежней админке и переучиваться не стали: это было условием заказчика.
Импорт перестал быть загадкой. Если партнёр присылает ленту в другом виде или не присылает вовсе, редактор получает письмо и знает, что делать. Раньше о проблеме догадывались по пустой рубрике.
Копии базы хранятся отдельно от сервера, и разворачивал я их на тестовой машине. Если сервер выйдет из строя, сайт поднимется заново, а не будет собираться по кускам.
Теперь про ограничение. Zend Framework 1 и вторая ветка CakePHP давно не развиваются, и кеширование этого не исправит. Дыры в них никто не закроет, поэтому я продолжаю следить за обновлениями, а портал двигается по плану: следующим идёт перенос админки, затем разделы публичной части.
Ваш сайт падает в самый неудобный момент, а менять его целиком страшно? Напишите мне на freelance.ru, где он стоит и на чём сделан. Посмотрю код и сервер и предложу порядок работ.