Компиляция скриптов php (Алексей Романенко)
DESCRIPTION
TRANSCRIPT
Компиляция скриптов PHP
Алексей Романенко (РБК)
Зачем?
Как работает PHP
Server API (SAPI)(mod_php, FastCGI, CLI...)
Как работает PHP
Server API (SAPI)(mod_php, FastCGI, CLI...)
PHP Core(Request management,
files, network)
Как работает PHP
Server API (SAPI)(mod_php, FastCGI, CLI...)
PHP Core(Request management,
files, network)
Zend Engine(Compile & execute,
memory management)
Как работает PHP
Server API (SAPI)(mod_php, FastCGI, CLI...)
PHP Core(Request management,
files, network)
Zend Engine(Compile & execute,
memory management)
Extensions(date, dom, mysql, reflection, session...)
Процесс выполнения скрипта Лексический анализ
Процесс конвертации кода из набора символов в набор токенов
Процесс выполнения скрипта Лексический анализ Синтаксический анализ
Происходит анализ токенов для определения их грамматической структуры
Процесс выполнения скрипта Лексический анализ Синтаксический анализ Генерация байткода
На основе лексического и синтаксического анализа генерится байт код
Процесс выполнения скрипта Лексический анализ Синтаксический анализ Генерация байткода Выполнение байткода
Каждый раз одно и то же!
Это медленно :-(
Ускоряем
Кеш байткода (APC, eAccelerator, Xcache, Zend Accelerator) Написание расширений (C) Переписать все на C/C++ Компилировать php-код куда-то и во что-то
А давайте что-нибудь скомпилируем!
Компиляция
Native code Non-native code
Native code
Roadsend PHP Raven PHC (PHP Open Source compiler) HipHop
Non-native code
Java bytecode Quercus Project Zero
.NET Phalanger
Roadsend PHP
Разработка началась в 2002 OpenSource с 2007 Использует компилятор Bigloo для языка Scheme Не использует Zend Engine
Roadsend PHP
Standalone binaries Модуль для Apache Standalone web-server
Roadsend PHP
Не работает!
Raven (rphp)
Это Roadsend, переписанный на C++ и использующий LLVM в качестве генератора кода.
Raven (rphp)
Under construction
phc
OpenSource с 2005 Использует PHP embeded SAPI Standalone binary executables PHP-code → PHP-extension, C
phc / cli-app
$ phc -c helloworld.php -o helloworld
$ ./helloworld
$ phc --generate-c helloworld.php > helloworld.c
$ phc -O2 -c helloworld.php -o helloworld
$ phc -c -O2 helloworld.php -o helloworld -C-fno-inline
phc / web-app
$ phc --extension=helloworld --generate-c helloworld.php > ext/helloworld.c
$ phpize --with-php-config=/usr/bin/php-config
$ ./configure —enable-helloworld
$ make
$ sudo make install
phc
Плюсы: Совместимость с “обычным” PHP Поддержка расширений Хорошая документация
phc
Минусы: Не полноценный binary executable Зависит от Zend Engine Сложность подключения для web-проектов
HipHop
Разработан в Facebook OpenSource с февраля 2010 Транслирует код php в код C++ 100% php-кода компилируется через HipHop Заявлено снижение CPU на 50%
HipHop
Standalone binary executables Multi-threaded Web server Встроенный debuger (local и remote)
HipHop: hphp --help--config=FILE
Опции из конфигурационного файла. Файл в формате HDF
--db-config=STRINGЧитает конфигурацию из DB. Строка в формате :@:/.
-l, --log=INT Устанавливает уровень логирован в stdout:0: No logging1: Only errors2: The same as 1 plus warnings.3: The same as 2 plus extra information.4: All log messages.
--input-list=FILEУстанавливает путь к файлу со списком PHP-скриптов, которые будут компилироваться.
HipHop: hphp$ hphp hello.php --keep-tempdir=1 –log=3
running hphp...creating temporary directory /tmp/hphp_AZ4F7V ...parsing inputs...parsing inputs took 0'00" (55 ms) (null)pre-optimizing...pre-optimizing took 0'00" (325 ms) (null)inferring types...inferring types took 0'00" (134 ms) (null)post-optimizing...post-optimizing took 0'00" (72 ms) (null)creating CPP files...creating CPP files took 0'00" (634 ms) (null)compiling and linking CPP files...
compiling and linking CPP files took 2'19" (139099 ms) (null)
HipHop$ ls -lh /tmp/hphp_AZ4F7Vtotal 29M-rw-r--r-- 1 santiago santiago 24K 2010-10-24 23:49 CMakeCache.txtdrwxr-xr-x 6 santiago santiago 4.0K 2010-10-24 23:51 CMakeFiles-rw-r--r-- 1 santiago santiago 1.6K 2010-10-24 23:49 cmake_install.cmake-rw-r--r-- 1 santiago santiago 3.2K 2010-10-24 23:49 CMakeLists.txt-rw-r--r-- 1 santiago santiago 23K 2010-10-24 23:49 Makefiledrwxr-xr-x 3 santiago santiago 4.0K 2010-10-24 23:49 php-rwxr-xr-x 1 santiago santiago 28M 2010-10-24 23:51 program-rw-r--r-- 1 santiago santiago 57 2010-10-24 23:49 sep_extensions.mkdrwxr-xr-x 2 santiago santiago 4.0K 2010-10-24 23:49 sys
HipHop$ cat /tmp/hphp_AZ4F7V/php/hello.cpp#include <php/hello.h>#include <php/hello.fws.h>#include <runtime/ext/ext.h>
namespace HPHP {
/* preface starts */extern CallInfo ci_;/* preface finishes */Variant pm_php$hello_php(bool incOnce /* = false */,
LVariableTable* variables /* = NULL */, Globals *globals /* = get_globals() */) {
PSEUDOMAIN_INJECTION(run_init::hello.php, pm_php$hello_php); LVariableTable *gVariables __attribute__((__unused__)) = (LVariableTable *)g; echo(NAMSTR(s_ss49e671b1, "Hello world!")); return true;} /* function */
}
HipHop: ./program --help-m, --mode
run: (default) directly executes the program from command line.debug: starts debugger.server: starts an HTTP server from command line.daemon: starts an HTTP server and runs it as a daemon.replay: replays a previously recorded HTTP request file.translate: translates a hex-encoded stacktrace.
-c, --config=FILE-p, --port--admin-port--debug-host--debug-port
HipHop: admin serverGET http://localhost:9999
/stop: stop the web server/status.xml: show server status in XML/status.json: show server status in JSON/status.html: show server status in HTML/prof-cpu-on: turn on CPU profiler/prof-cpu-off: turn off CPU profiler/stats-malloc: turn on/off malloc statistics/leak-on: start leak detectionetc
HipHop: statusGET http://[server]:9999/status.[xml|json|html]
Показывает статус запущенных процессов сервера и воркеров.
[process] [id] [build] ... [threads] [thread] [id] [req] ... [thread] ...
HipHop: statsСтатистика сервера:GET http://[server]:9999/stats.[fmt]?from=[t1]&to=[t2]&keys=...
Доступные ключи:
SQL StatsMemCache StatsAPC StatsMemory StatsPage Sectionsevhttp Stats:Application Stats ( hphp_stats($key, $count); )
HipHop: debug$ ./hphpi -f test.php$ ./hphpi -m debug -f test.php
hphpd> break test.php:5hphpd> break foo()hphpd> runhphpd> print $ahphpd> <?php print $a; ?>hphpd> continuehphpd> quit
HipHop: RPC-serverhttp://[server]:[port]/function_name?params=...
params – json-массив
http://[server]:[port]/function_name?p=[json value]&p=[json value]...
Return:array { "return" => [function's return]}
HipHop
Не поддерживается: eval() create_function() preg_replace() c /e
HipHop
Плюсы: Активно развивается + поддержка Facebook
Native code
Прирост производительности, снижение CPU
Гибкость в конфигурации, администрированию и debug
Много дополнительных возможностей
Неплохая документация
Production-ready
HipHop
Минусы: Сложность сборки, ряд ограничений 32bit support experimental Поддержка модулей ограничена Нет поддежки PHP 5.3 (скоро)
HipHop
Не ускоряет ваши SQL-запросы Не ускоряет загрузку картинок и статического контента Не улучшает отладку Это не silver bullet для PHP
HipHop
Снижение CPU → уменьшение кол-во серверов
Benchmark #1<?php
$r = 0;
for ($i = 0; $i < 10000; $i++) {
for ($j = 0; $j < 10000; $j++) {
$r = ($r + ($i * $j) % 100) % 47;
}
}
echo 'answer: ' . $r . "\n";
?>
Benchmark #1
$ uname -srvmo
Linux 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686 GNU/Linux
1. HipHop — 15,68 сек
2. PHP 5.3.2 — 24,79 сек
3. phc — 31,2 сек
Benchmark #2http://svn.php.net/viewvc/php/php-src/trunk/Zend/bench.php
1. HipHop — 2,879 сек
2. phc — 5,66 сек
3. PHP 5.3.2 — 8,49 сек
Benchmark #3
1. Apache/2.2.14 + php-5.3.2
2. Apache/2.2.14 + php-5.3.2 + APC 3.1.3
3. Nginx 0.7.65 + php-fpm 5.3.3
4. Nginx 0.7.65 + php-fpm 5.3.3 + APC 3.1.4
5. HipHop
Benchmark #3
HTML-страница, 10 include “*.php”, rps
Так что же выбрать?Компилировать или нет?
1. Упираемся в CPU 100%
2. Автономность вашего приложения
3. Снижение кол-ва серверов
4. Много php-кода, который лень переписывать
СсылкиRoadsend http://code.roadsend.com/pcc
phc http://www.phpcompiler.org/
HipHop http://github.com/facebook/hiphop-php/wiki