Оптимизация php для конкретного приложения

Для кого данный метод?

Данный метод не подойдет для обычного хостинга, где хостер предлагает свою версию php. Данный метод не подойдет тем, кто ботся коммандной строки.

Основные требования:

  • компилятор GCC или Microsoft visual C++ для windows
  • свежие исходники php

Ну а пока выполняется комманда apt (yum) или устанавливается студия в windows, копнем в теорию.

Как выполняются php программы.

Так, как php является интерпретируемым языком, php программа представляет из себя набор файлов (или один файл). Во время выполнения интерпритатор считывает содержимое файла и выполняет описанные в нем инструкции. Собственно во время выполнения скрипта и возникает нагрузка на сервер и данная нагрузка зависит от прямизны рук программистов и от сложности самого проекта. О способах поиска узких мест в скриптах я уже писал, а сейчас я хочу поговорить о самом интерпретаторе.

Как собрать php из исходников.

Далее я буду описывать процесс под *nix системами. Сборка в windows аналогична, за исключением студии.

Сборка мало чем отличается от сборки любой другой программы:

 
./configure
make
make install 

Причем первой команде можно передать кучу параметров для сборки: укзать пути, включить режим отладки и т.д. с полным списком параметров можно ознакомиться на сайте php.

Но и у второй команды (make) есть ряд параметров: различные BINDIR, CFLAGS и т.д. В частности есть очень интересный параметр prof-gen. Вызов с данной коммандой будет таким:

 
./configure
make prof-gen
make install 

Данная сборка выдаст больший по обьему бинарный файл и работать он будет медленнее, чем обычная сборка PHP. Но шаг к тормознутости небходим т.к. в этом режиме включаются режими записи логов для компилятора. На данном шаге необходимо запустить веб приложение и максимально использовать его возможности, протестировать основные узлы. Особое внимание надо уделить:

  • соединениям с базами данных
  • кешированию
  • корректной работе моделей и контроллеров
  • функций приложения, работающих с файловой системой сервера (fopen(), file_get_contents() и т.д.)
  • механизмов протокала REST
  • функций приложения, использующих системные вызовы (system(), exec(), fork() и т.д.)

После того, как мы поработали с приложением, а сборка php собрала необходимую статистику по его работе, можно приступать к следующиму шагу.

Заключительная пересборка интерпретатора php

Все волшебство заключается в очередном параметре make:

 
make prof-use
make install

Теперь пересобранный бинарник будет весить столько же, сколько и при обычной сборке (возможно меньше), но скорость работы для конкретного приложения должна возрасти. В Данном методе использовалась Profile-guided optimization (PGO) — техника оптимизации программы компилятором. Данная техника анализирует использование приложения и соответствующим образом оптимизирует бинарник. Вот далеко не полный список того, что делает данная техника:

  • Size/Speed Optimization – функции в которых программа тратит значительную часть времени могут быть оптимизированы по скорости выполнения
  • Inlining – например, если функция A часто вызывает функцию B, и функция B достаточна мала, тогда функция B встраивается в A. Это делается на основе реальной статистике запусков программы.
  • Register Allocation – оптимизация распределения регистров на основе собранных данных.
  • Function Layout – на основе графа вызовов, функции которые принадлежат одной цепочки исполнения будут помещены в одну и ту же секцию.

Полный список того, что делает данный метод, можно найти тут.

Послесловие

Данный метод не даст результатов при использовании на сервере зоопарка CMS, но если в продакшене держать одно конкретно взятое приложение, то можно добиться очень хороших результатов. Например wordpress в стал на 17,4% быстрее обрабатывать стр