ݺߣ

ݺߣShare a Scribd company logo
Компиляция скриптов
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 logging
1: Only errors
2: 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_AZ4F7V
total 29M
-rw-r--r-- 1 santiago santiago 24K 2010-10-24 23:49 CMakeCache.txt
drwxr-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 Makefile
drwxr-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.mk
drwxr-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 server
GET 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 detection
etc
HipHop: status
GET 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 Stats
MemCache Stats
APC Stats
Memory Stats
Page Sections
evhttp Stats:
Application Stats ( hphp_stats($key, $count); )
HipHop: debug
$ ./hphpi -f test.php
$ ./hphpi -m debug -f test.php
hphpd> break test.php:5
hphpd> break foo()
hphpd> run
hphpd> print $a
hphpd> <?php print $a; ?>
hphpd> continue
hphpd> quit
HipHop: RPC-server
http://[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 #2
http://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
СПАСИБО!
Вопросы?
Алексей Романенко
E-mail: aromanenko@rbc.ru

More Related Content

Компиляция скриптов PHP. Алексей Романенко