PHP

Компиляция PHP приложений - HipHop-php

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.

Среднее количество обработанных запросов за секунду в нескомпилированом 9, а в скомпилированом 50! Не знаю как вас, а меня эти результаты поразили, такого сильного прироста производительности не ожидал.

Подведем итог
После таких ошеломляющих результатов можно сказать только одно - ребята из Facebook поработали на славу. Компилятор действительно делает из приложения ракету и хотя перед компилированием приложение нужно подготавливать - результат того стоит.
Добавлено: 12 Сентября 2013 03:45:39 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...