Изучив истории успеха миграции на PHP7 крупных компаний, я решил не отставать от прогресса и также перевести свой маленький и уютный HP ProLiant MicroServer на свежую версию. Вот что из этого вышло …
Проверка миграции производилась на сервере wr.su, основной работающий проект — Книжная Полка, полностью написанная на PHP, без использования сторонних фреймворков. Код сайта был заблаговременно буквально вылизан вдоль и поперёк для максимального ускорения работы на PHP 5.6.
Проблемы
Было бы очень странно, если таковая миграция обошлась бы без единой проблемы. Взглянем на них поближе:
- Тёплый ламповый Debian Jessie из коробки не хотел поддерживать седьмую версию. Поэтому пришлось слегка переместиться на Testing. В моём конкретном случае была дополнительно подключена тестовая ветка, и с неё установлены следующие пакеты: apache2 сотоварищи, собственно php в комплекте с curl, gd, memcache и mysql. Все зависимости apt-get осилил самостоятельно.
- Необходимо тщательно проверить код своих сайтов перед переносом. PHP7 стал гораздо строже относиться к раздолбаям. Например, пора забыть о MySQL и переходить на MySQLi, отказаться от устаревших конструкторов объектов с отличным от __constuct() названием, устранить отголоски Индии в коде.
- Не все проекты согласились на работу в новой среде. Старый добрый Клуб Писателей оказался слишком стар и слишком добр к себе, чтобы принять такие нововведения. Вероятная причина — работа на запрещённом MySQL, переделывать лень и смысла нет, ибо проект уже давно закрыт и доживает своё. Результат — миграция WC на запасной аэродром.
Факты
Остановимся поподробнее на конкретных цифрах прироста производительности на примере wcbook.ru. Контроль памяти и скорости можно провести по данным, которые выводятся в коде страницы в самом конце.
- Скорость обработки запросов увеличилась в среднем вдвое. Без обращения к MySQL, только силами PHP и MemCache — с 25-35 мс до 10-15мс на один запрос. С обращением к MySQL — с 60-80мс до 35-45мс. Сравнивались аналогичные запросы к страницам. Первый запрос использует MySQL для выгрузки данных, второй работает только с MemCached, без подключения к основной базе. Некоторые запросы дают куда большее время выполнения из-за медленной работы самой базы — там 1.5 гб данных, маленькому серверу трудно ими манипулировать.
- Среднее потребление памяти сократилось на четверть. Ранее на генерацию страницы с обращением к базе требовалось в среднем 900-1200 кб памяти, запросы без доступа к базе обрабатывались на 800-900кб. После перехода, зависимость от подключения к базе практически пропала, средний расход вышел на 650-750кб. Оба теста проводились с включенным встроенным в PHP модулем OpCache.
- Средняя нагрузка на диск сократилась до нуля. Метрика очень субъективна. Ранее iotop давал хоть какие-то данные о занятости диска процессами apache2, теперь же они там практически не появляются. Редкие операции записи на диск — создание новых миниатюр картинок.
Приятные мелочи
Эти факты не особо важны и в целом субъективны:
- Хорошо написанный код для PHP 5.6 совершенно спокойно работает на семёрке без дополнительных правок. В процессе перевода WCbook внутри всего кода правок мне пришлось сделать … да ни одной! Всё сразу же заработало,
ибо код написан руками, растущими из плеч, на которых есть голова с мозгом внутри. - Поддержка HTTP/2, пришедшая вместе со свежей версией Apache 2.4, приятно ускоряет работу с точки зрения пользователя. Загрузка страниц визуально проходит значительно быстрее. Единственный минус — Яндекс пока (март 2016) не умеет работать с HTTP/2, поэтому ему приходится урезать заголовок Upgrade: h2
Вывод
Итого, подведём черту под миграцией на PHP7:
- Мигрировать на PHP7 имеет смысл, если вы знаете свой код и уверены в том, что он написан качественно. Как минимум, с соблюдением стандартов и использованием свежих версий PHP.
- Прирост производительности есть и он ощутимый. Для кривого кода он может оказаться ещё ощутимее, поскольку PHP7 оптимизирует многие наиболее идиотские действия разработчиков.