PHP - интерпретируемый язык программирования, при каждом запросе происходит анализ и "выполнение" исходного кода. Такой подход, конечно, очень удобен на стадии разработки проекта, но вносит лишний шаг в процесс выполнения продакшен кода. Таким образом интерпретация, на первый взгляд сильная сторона PHP, стоит лишнего процесорного времени и ресурсов.
Ниже речь пойдет о компиляторах, позволяющих компилировать php код в C++, а его в исполняемый. Таким образом PHP приложения выполняются непосредсвенно процессором, минуя интерпретатор.
Проверим все ли так хорошо на практике.
Как работает интерпретатор
Интерпретация PHP кода проходит в два этапа:
- Парсинг кода и генерация опкодов (Zend opcodes) - инструкций, понятных интерпретатору.
- Выполнение опкодов.
Тогда как первая фаза хорошо поддается оптимизации (использование кеша опкодов), вторая довольно закрытая - интерпретатор всегда является посредником между набором команд и процессором, выполняющим их. Без интерпретатора, процессору не понять, чего делать с опкодами.
Чтобы избавиться от звена-интерпретатора придумали компиляторы, наиболее популярный и свежий из них HipHop от Facebook. Пощупаем его поближе.
HipHop PHP 
HipHop написан разработчиками Facebook и представляет собой приложение, которое:
- оптимизирует PHP код
- конвертирует в С++
- генерирует из вашего приложения многопоточный веб-сервер исполняющий его
- компилирует в исполняемый код при помощи g++
Таким образом на входе PHP код, на выходе сервер, частью которого является написаный функционал.
Проверим, как справится HipHop с компилированием приложения написаного с использованием фреймворка, например Wordpress.
Компилируем Wordpress
После установки HipHop в папке src/hphp/ получим файл hphp, который и является компилятором. Перед началом компиляции, устанавливаем переменные среды:
cd .. # переходим в папку с hiphop
export HPHP_HOME=`pwd`
export HPHP_LIB=`pwd`/bin
export CMAKE_PREFIX_PATH=`/bin/pwd`/../
и вперед!
Скачиваем Wordpress и разархивируем архив:
wget http://wordpress.org/latest.tar.gz
tar zxvf latest.tar.gz
Копируем wp-config-sample.php в wp-config.php и указываем настройки соединения с базой (в настройках хоста указываем 127.0.0.1, а не localhost).
Для удачной компиляции нужно немного пропатчить Wordpress:
- Открываем wp-includes/js/tinymce/plugins/spellchecker/classes/SpellChecker.php и заменяем:
наfunction &loopback(/* args.. */) { return func_get_args(); }
function &loopback(/* args.. */) { $ret = func_get_args(); return $ret; }
- В wp-includes/query.php, вместо
вставляемif ( !isset($q['suppress_filters']) ) $q['suppress_filters'] = false;
$q['suppress_filters'] = true;
Wordpress готов.
Hiphop'у нужно указать список файлов, которые будем компилировать - получим его и сохраним в files.list:
find . -name "*.php" > files.list
Все готово к компиляции, приступим:
$HPHP_HOME/src/hphp/hphp --input-list=files.list -k 1 --log=3 --force=1 --cluster-count=50
После завершения выполнения команды, во временной папке (в начале компиляции hphp покажет ее путь, что то типа "/tmp/hphp_ptRgV1") получим скомпилированный веб-сервер. Запустим его (если на 80 порту, что-то висит, например apache или nginx - нужно сначала остановить, чтобы освободить порт):
sudo /tmp/hphp_6s0pzd/program -m server -v "Server.SourceRoot=`pwd`" -v "Server.DefaultDocument=index.php" -c $HPHP_HOME/bin/mime.hdf
Вуаля! Перейдя на http://localost увидим рабочий Wordpress блог.
Производительность
Посмотрим, будет ли прирост производительности, по сравнению с нескомпилированой версией Вордпреса, бегающей на apache2. Ниже графики зависимости скорости генерации страниц от количества параллельных пользователей.
Как видите результаты получились шокирующие: скомпилированый блог работает в среднем в 6 раз быстрее! Среднее количество обработанных запросов за секунду в нескомпилированом 9, а в скомпилированом 50! Не знаю как вас, а меня эти результаты поразили, такого сильного прироста производительности не ожидал.
Подведем итог
После таких ошеломляющих результатов можно сказать только одно - ребята из Facebook поработали на славу. Компилятор действительно делает из приложения ракету и хотя перед компилированием приложение нужно подготавливать - результат того стоит.
В тему:
Если пост понравился - нажмите на гугловский +1 - мне будет больше мотивации писать ещё и просто приятно.