Миграция сервера WR на PHP7

Опубликовано 13.03.2016 в 12:38 в разделе ,

Изучив истории успеха миграции на PHP7 крупных компаний, я решил не отставать от прогресса и также перевести свой маленький и уютный HP ProLiant MicroServer на свежую версию. Вот что из этого вышло …

php7

Проверка миграции производилась на сервере wr.su, основной работающий проект — Книжная Полка, полностью написанная на PHP, без использования сторонних фреймворков. Код сайта был заблаговременно буквально вылизан вдоль и поперёк для максимального ускорения работы на PHP 5.6.

Проблемы

Было бы очень странно, если таковая миграция обошлась бы без единой проблемы. Взглянем на них поближе:

  1. Тёплый ламповый Debian Jessie из коробки не хотел поддерживать седьмую версию. Поэтому пришлось слегка переместиться на Testing. В моём конкретном случае была дополнительно подключена тестовая ветка, и с неё установлены следующие пакеты: apache2 сотоварищи, собственно php в комплекте с curl, gd, memcache и mysql. Все зависимости apt-get осилил самостоятельно.
  2. Необходимо тщательно проверить код своих сайтов перед переносом. PHP7 стал гораздо строже относиться к раздолбаям. Например, пора забыть о MySQL и переходить на MySQLi, отказаться от устаревших конструкторов объектов с отличным от __constuct() названием, устранить отголоски Индии в коде.
  3. Не все проекты согласились на работу в новой среде. Старый добрый Клуб Писателей оказался слишком стар и слишком добр к себе, чтобы принять такие нововведения. Вероятная причина — работа на запрещённом MySQL, переделывать лень и смысла нет, ибо проект уже давно закрыт и доживает своё. Результат — миграция WC на запасной аэродром.

Факты

Остановимся поподробнее на конкретных цифрах прироста производительности на примере wcbook.ru. Контроль памяти и скорости можно провести по данным, которые выводятся в коде страницы в самом конце.

  1. Скорость обработки запросов увеличилась в среднем вдвое. Без обращения к MySQL, только силами PHP и MemCache — с 25-35 мс до 10-15мс на один запрос. С обращением к MySQL — с 60-80мс до 35-45мс. Сравнивались аналогичные запросы к страницам. Первый запрос использует MySQL для выгрузки данных, второй работает только с MemCached, без подключения к основной базе. Некоторые запросы дают куда большее время выполнения из-за медленной работы самой базы — там 1.5 гб данных, маленькому серверу трудно ими манипулировать.
  2. Среднее потребление памяти сократилось на четверть. Ранее на генерацию страницы с обращением к базе требовалось в среднем 900-1200 кб памяти, запросы без доступа к базе обрабатывались на 800-900кб. После перехода, зависимость от подключения к базе практически пропала, средний расход вышел на 650-750кб. Оба теста проводились с включенным встроенным в PHP модулем OpCache.
  3. Средняя нагрузка на диск сократилась до нуля. Метрика очень субъективна. Ранее iotop давал хоть какие-то данные о занятости диска процессами apache2, теперь же они там практически не появляются. Редкие операции записи на диск — создание новых миниатюр картинок.

Приятные мелочи

Эти факты не особо важны и в целом субъективны:

  1. Хорошо написанный код для PHP 5.6 совершенно спокойно работает на семёрке без дополнительных правок. В процессе перевода WCbook внутри всего кода правок мне пришлось сделать … да ни одной! Всё сразу же заработало, ибо код написан руками, растущими из плеч, на которых есть голова с мозгом внутри.
  2. Поддержка HTTP/2, пришедшая вместе со свежей версией Apache 2.4, приятно ускоряет работу с точки зрения пользователя. Загрузка страниц визуально проходит значительно быстрее. Единственный минус — Яндекс пока (март 2016) не умеет работать с HTTP/2, поэтому ему приходится урезать заголовок Upgrade: h2

Вывод

Итого, подведём черту под миграцией на PHP7:

  1. Мигрировать на PHP7 имеет смысл, если вы знаете свой код и уверены в том, что он написан качественно. Как минимум, с соблюдением стандартов и использованием свежих версий PHP.
  2. Прирост производительности есть и он ощутимый. Для кривого кода он может оказаться ещё ощутимее, поскольку PHP7 оптимизирует многие наиболее идиотские действия разработчиков.