Недавно PHP-проекты Авито перешли на PHP 7.1. По этому поводу мы решили вспомнить, как происходил переход на PHP 7.0 у нас и наших коллег из OLX. Вещи остались в прошлом, но все еще есть красивая графика, которую я хочу показать миру.
Первая часть рассказа основана на статье PHP не умер! PHP7 на практике , который написал наш коллега из OLX Лукаш Шиманский (Łukasz Szymański): переход OLX на PHP 7. Во второй части - опыт миграции Авито на PHP 7.0 и PHP 7.1: процесс, сложности, результаты с графиками.
Часть 1. PHP 7 в OLX OLX Europe управляет десятью веб-сайтами, крупнейшим из которых является OLX.pl. Все наши сайты должны работать максимально эффективно, поэтому переход на PHP 7 стал для нас главным приоритетом.
В этом посте мы расскажем, с какими проблемами мы столкнулись и чего удалось добиться при переходе на PHP 7. Переход обсуждался на конференции PHPers Summit 2016. Слайды
Переход
Вопреки нашим опасениям, миграция прошла гладко.Кроме стандартного списка необходимых изменений от официальная документация , нам нужно было лишь внести некоторые изменения, связанные с нашей архитектурой.
Стоит отметить, что десять наших сайтов работают в разных странах.
И выкатываем изменения последовательно: на один сайт за другим.
Этот подход особенно важен при внесении серьезных изменений.
Мы начали обновлять версию с самого маленького сайта и переходили к более крупным, следя за тем, чтобы тесты прошли успешно.
Это позволило отслеживать непредвиденные проблемы и снизить потенциальный ущерб.
Кэш памяти
Прекращение поддержки Memcache в PHP 7 побудило нас перейти на Memcached. Нам нужно было поддерживать две версии сайта: PHP 5 + Memcache и PHP 7 + Memcached. Для решения проблемы мы использовали простую обертку.Он выбирает соответствующий модуль PHP для подключения к кешу на основе информации о сервере, на котором выполняется код.
Однако на этом приключения с Memcached не закончились.<Эphp $factory = new CacheWrapperFactory(); $factory->createServer( extension_loaded('memcache') ? 'memcache' : 'memcached', $uri );
Оказывается, объекты, сериализованные с помощью Memcache, невозможно десериализовать с помощью Memcached. Но кэш — это всего лишь кэш, потому что его можно легко удалить.
Поэтому мы просто удалили старые проблемные объекты из кэша и воссоздали их с помощью нового модуля.
APC, APCu и OPCache
Немного об условиях.APC (Альтернативный PHP-кэш) — это кеш байт-кода и пользовательских данных.
APCu (APC User Cache) — только кэш пользовательских данных.
OPCache — это только кеш байт-кода.
В PHP 7 нет APC, пришлось брать и APCu, и OPCache. Ранее мы использовали API APC во многих важных частях нашей инфраструктуры управления кэшем, поэтому подключили модуль к APCu. апку-BC совместим с API APC.
Результаты
Ниже приведены результаты крупнейшего из наших сайтов OLX.pl.Процессор на Apache
Наши веб-серверы (Apache) работают на 20 физических машинах с 32 процессорными ядрами каждая.Пиковое потребление процессора в результате миграции снизилось с 50% до 20%.
Лос-Анджелес на Апаче
Аналогичным образом снизилась и средняя нагрузка на веб-серверы.
Цифры говорят сами за себя: снижение нагрузки, экономия ресурсов, повышение эффективности.
Если ваши менеджеры проектов или клиенты не уделяют достаточно времени для миграции, эти графики наверняка их убедят.
Причины эффективности PHP 7
Эти потрясающие результаты были достигнуты благодаря оптимизации по трем основным направлениям.
Меньше выделения памяти
PHP 5 тратил 20% процессорного времени только на операции выделения памяти.Разработчики языка обратили на это внимание и сократили количество операций выделения памяти, тем самым существенно снизив потребление процессора.
Меньше потребления памяти
На этом эскизе показан путь, который должен пройти процессор для доступа к оперативной памяти (ОЗУ), с указанием времени, затрачиваемого на каждый шаг.
Как видите, сегмент оперативной памяти самый длинный.
Разработчики PHP сократили потребление памяти, благодаря чему приложения реагируют быстрее.
Меньше промежуточных указателей
Последней причиной повышения эффективности PHP 7 является сокращение количества промежуточных указателей.
Чтобы добиться этого, разработчики PHP избавились от множества указателей, ссылающихся на другие указатели; вместо этого они заставили указатели ссылаться непосредственно на запрашиваемые объекты.
Код
Помимо повышения эффективности, PHP 7 готовит небольшую революцию в структуре кода.
Скаляры в объявлении функции
До PHP 7 типы аргументов функции могли быть только объектами, интерфейсами, массивами или вызываемыми.
В качестве примера возьмем следующий код.
Очевидно, что использование подобных методов создаёт массу проблем, если вы не уверены в корректности входящих аргументов.
Помимо добавления проверок типов в каждый метод, вы можете использовать конструкцию ValueObject из предметно-ориентированного программирования (DDD).
PHP 7 позволяет вам просто указывать скаляры, такие как string, int, float, bool. Вы также можете указать тип возвращаемого значения.
Строгий режим
Но простое добавление в код вышеуказанных конструкций может не дать ожидаемых результатов.Это связано с тем, что PHP 7 по умолчанию работает в принудительном режиме, в котором происходят обычные преобразования типов.
Если вы не включили строгий режим принудительно, вы можете переписать приведенный выше метод следующим образом.
К сожалению, даже добавление конструкции Declare(strict_types=1) в файл PHPisNotDead.php не включает строгий режим.
Пояснение в примере ниже.
В комментариях указаны возвращаемые значения.
Почему это происходит? Строгая типизация в методах класса PHPisNotDead включена только для возвращаемых значений.
Если вам также необходимо включить строгую типизацию для аргументов, вам придется добавить объявление strict_types во все файлы, в которых вызываются методы класса.
Более подробную информацию о спецификации типа и ее влиянии на выполнение программы можно найти в документация .
Чтение этой документации позволит избежать неожиданностей при запуске вашего кода.
Будущее
Если даже сейчас вы все еще не решили перейти на PHP 7, взгляните на список поддерживаемые версии PHP .Версия 5.6 больше не получает активной поддержки, а в конце 2018 года перестанут выпускаться даже исправления критических уязвимостей.
Активная поддержка продолжается для версий 7.0 и выше.
Следите за новостями мира PHP и планами на новые версии.
Самые интересные посты: дружеские классы , универсальные типы и функции .
Другие предложения по развитию речи вы можете найти в PHP RFC.
Полученные результаты
PHP 7 впечатляет: помимо повышения эффективности, он помогает разработчикам писать более качественный код. Я составил небольшое руководство, которое поможет вам принять решение о переходе.— Когда стоит переходить на PHP 7? - Прямо сейчас.
Часть 2. PHP 7 на Авито
Процесс перехода на PHP 7.0
Мы, как и OLX, осуществили переход наших сервисов на PHP 7 постепенно.Сначала мы переводили небольшие автономные сервисы, тестировали их и исправляли возникающие ошибки.
Далее мы перешли к последовательному обновлению админ-серверов сайта, после чего выкатили остальные сервисы и сайт на PHP 7.
Трудности перехода
Читаем список обратно несовместимые изменения .Однако это не уберегло от всех бед. В старом коде был класс String. PHP 7 выдал ошибку «Невозможно использовать «String» в качестве имени класса, поскольку оно зарезервировано».
Класс переименован.
обрати внимание на список зарезервированных слов .
В PHP 7 изменился формат файла кэша для схемы WSDL в SoapClient. Вы можете настроить сохранение кеша в разные директории в зависимости от версии PHP или полностью очистить кеш перед сменой версии интерпретатора.
Расширение mongo, которое мы активно использовали, больше не поддерживается в новом PHP. Вместо этого мы начали использовать официальную библиотеку PHP-библиотека MongoDB .
Мы просмотрели весь код и заменили MongoCollection::insert() на MongoDB\Collection::insertOne(), MongoCollection::remove() на MongoDB\Collection::deleteMany() и так далее.
Начал использовать классы для работы с BSON из нового Драйверы MongoDB например, MongoDate вместо MongoDB\BSON\UTCDateTime.
Результат
Админу стало легче.
Я также доволен серверной частью сайта.
Обновление до PHP 7.1
В PHP 7.1 появилось несколько очень приятных нововведений: тип void для возвращаемых значений, итерируемость, возможность возвращать null для типизированных возвращаемых значений, константная область видимости и т. д. Кроме того, в конце этого года заканчивается период активной поддержки PHP 7.0. Мы решили перейти на PHP 7.1.Сюрпризы
Во время обновления возникла проблема на ровном месте.Пакет php-memcached для версии 7.1 включил в себя пакет php-igbinary. Когда мы установили PHP 7.1 на один из рабочих серверов, с других серверов начали сыпаться ошибки, в которых появилось слово «igbinary».
Старый друг Memcache, снова различия в сериализации, но с немного другим соусом.
Оказалось, что модуль php-memcached по умолчанию использует первый доступный сериализатор из списка: igbinary (в отдельном модуле), msgpack (в отдельном модуле), php (не требует отдельного модуля, доступен всегда).
И сервер, на котором мы установили 7.1 с igbinary, начал записывать в memcache данные, сериализованные igbinary. А остальные серверы не поддерживали этот сериализатор и не могли читать данные, написанные сервером с обновленным PHP. Мы локализовали проблему, установили igbinary на все остальные сервера, и ошибки прекратились.
Послесловие PHP-разработчики прошли хороший курс.
Они добавляют полезные инструменты, избавляются от недостатков, связанных с наследием языка, и серьезно задумываются о производительности.
Ранее мы говорили о переходе Авито на сервисную архитектуру ( один раз , два ).
Такая архитектура позволяет нам писать на любом языке, а новые сервисы мы чаще всего пишем на Go или Python. Однако об отказе от PHP речи не идет: основная логика сайта (монолита) по-прежнему находится на PHP, и команда прекрасно знает, как с ним работать.
Новые версии интерпретатора делают код лучше и ускоряют его выполнение.
Поделитесь своим опытом перехода на PHP 7 и выше, мы будем рады обсудить открытия и грабли, с которыми вы столкнулись на этом пути.
Теги: #php7 #php #OLX #avito #Разработка сайтов #php
-
Цепные Реакции
19 Oct, 24 -
Ускорьте Загрузку Javascript И Css
19 Oct, 24 -
Делаем Файлы Скриптов Исполняемыми
19 Oct, 24