SlideShare 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

What's hot (20)

PDF
Highload 2014. PostgreSQL: ups, DevOps.
Alexey Lesovsky
 
PPT
PHP
Vasya Petrov
 
PDF
Hacking PostgreSQL. Обзор исходного кода
Anastasia Lubennikova
 
PDF
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Ontico
 
PPT
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
PPT
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Ontico
 
PDF
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
Fwdays
 
PDF
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
AvitoTech
 
PDF
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Anastasia Lubennikova
 
PDF
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Ontico
 
PDF
Расширения для PostgreSQL
Anastasia Lubennikova
 
PDF
Советы для начинающих разработчиков PostgreSQL
Anastasia Lubennikova
 
PDF
pgconf.ru 2015.avito postgresql recovery
Михаил Тюрин
 
PDF
Конструктор / Денис Паясь (Яндекс)
Ontico
 
PPTX
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
rit2011
 
PDF
Streaming replication in practice
Alexey Lesovsky
 
PDF
Hunting for a C++ package manager
corehard_by
 
PDF
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Ontico
 
PDF
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
IT Event
 
PDF
Сергей Белов "bem server: система сборки фронтенда"
Yandex
 
Highload 2014. PostgreSQL: ups, DevOps.
Alexey Lesovsky
 
Hacking PostgreSQL. Обзор исходного кода
Anastasia Lubennikova
 
5 способов деплоя PHP-кода в условиях хайлоада / Юрий Насретдинов (Badoo)
Ontico
 
Node.JS: возможности для РНР-разработчика
Alexei Smolyanov
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Ontico
 
"Fault tolerant workflow orchestration on PHP", Anton Tsitou
Fwdays
 
"Отказоустойчивый standby PostgreSQL (HAProxy + PgBouncer)" Виктор Ягофаров (...
AvitoTech
 
Hacking PostgreSQL. Локальная память процессов. Контексты памяти.
Anastasia Lubennikova
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Ontico
 
Расширения для PostgreSQL
Anastasia Lubennikova
 
Советы для начинающих разработчиков PostgreSQL
Anastasia Lubennikova
 
pgconf.ru 2015.avito postgresql recovery
Михаил Тюрин
 
Конструктор / Денис Паясь (Яндекс)
Ontico
 
сотни серверов, десятки компонент. автоматизация раскладки и конфигурирования...
rit2011
 
Streaming replication in practice
Alexey Lesovsky
 
Hunting for a C++ package manager
corehard_by
 
Как сделать ваш JavaScript быстрее / Роман Дворнов (Авито)
Ontico
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
IT Event
 
Сергей Белов "bem server: система сборки фронтенда"
Yandex
 

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

PDF
Компиляция скриптов PHP (Алексей Романенко)
Ontico
 
PDF
Как мы делаем модули PHP в Badoo – Антон Довгаль
Badoo Development
 
PPT
Catalyst – MVC framework на Perl (RIT 2008)
Sergey Skvortsov
 
PDF
Phalcon - самый быстрый PHP Framework
Oleksandr Torosh
 
PPT
Highload2009 Rybak Badoo Os
HighLoad2009
 
PDF
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Ontico
 
PDF
Enter: legacy code
Kamil Samigullin
 
PDF
Программируемость коммутаторов для ЦОД Cisco Nexus
Cisco Russia
 
PPTX
современная практика статического анализа безопасности кода веб приложений
Sergey Belov
 
PPTX
06 php instalation_ru
mcroitor
 
PDF
Zend Framework и мультиязычность
Stepan Tanasiychuk
 
PPT
Воюем за ресурсы (ZFConf2011)
Alexey Kachayev
 
PPTX
Пост-эксплуатация веб-приложений в тестах на проникновение
beched
 
PDF
Инструментируй это
Roman Dvornov
 
PPTX
Микрофреймворки PHP
Ekaterina Giganova
 
PPTX
PHP 5.4: Что нового?
phpdevby
 
PPT
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf Conference
 
ODP
Saint Perl 2009: CGI::Ajax demo
megakott
 
Компиляция скриптов PHP (Алексей Романенко)
Ontico
 
Как мы делаем модули PHP в Badoo – Антон Довгаль
Badoo Development
 
Catalyst – MVC framework на Perl (RIT 2008)
Sergey Skvortsov
 
Phalcon - самый быстрый PHP Framework
Oleksandr Torosh
 
Highload2009 Rybak Badoo Os
HighLoad2009
 
Веб-разработка без наркотиков с помощью PostgreSQL, Nginx и c2h5oh / Миша Кир...
Ontico
 
Enter: legacy code
Kamil Samigullin
 
Программируемость коммутаторов для ЦОД Cisco Nexus
Cisco Russia
 
современная практика статического анализа безопасности кода веб приложений
Sergey Belov
 
06 php instalation_ru
mcroitor
 
Zend Framework и мультиязычность
Stepan Tanasiychuk
 
Воюем за ресурсы (ZFConf2011)
Alexey Kachayev
 
Пост-эксплуатация веб-приложений в тестах на проникновение
beched
 
Инструментируй это
Roman Dvornov
 
Микрофреймворки PHP
Ekaterina Giganova
 
PHP 5.4: Что нового?
phpdevby
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf Conference
 
Saint Perl 2009: CGI::Ajax demo
megakott
 
Ad

More from Fuenteovejuna (20)

PDF
Facebook, Robert Johnson
Fuenteovejuna
 
PPT
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Fuenteovejuna
 
PPTX
Shared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
Fuenteovejuna
 
PPT
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
Fuenteovejuna
 
PPT
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
Fuenteovejuna
 
PPTX
Social Monitoring Tool codename Looking Glass, Patrice Pelland
Fuenteovejuna
 
PDF
Профилирование памяти в приложениях на Python, Антон Грицай
Fuenteovejuna
 
PPTX
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Fuenteovejuna
 
PPTX
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...
Fuenteovejuna
 
PDF
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Fuenteovejuna
 
PDF
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Fuenteovejuna
 
PPTX
Динамика DDoS-атак в России, Александр Лямин
Fuenteovejuna
 
PDF
Extreme Cloud Storage on FreeBSD, Андрей Пантюхин
Fuenteovejuna
 
PDF
Мониторинг XXI-век, Алиса Смирнова, Дима Никоненко
Fuenteovejuna
 
PDF
Native Client, Евгений Эльцин
Fuenteovejuna
 
PDF
Tarantool Silverbox, Юрий Востриков
Fuenteovejuna
 
PDF
Real time indexes in Sphinx, Yaroslav Vorozhko
Fuenteovejuna
 
PDF
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Fuenteovejuna
 
PPT
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
Fuenteovejuna
 
PDF
Вы решили написать собственное хранилище, Илья Космодемьянский
Fuenteovejuna
 
Facebook, Robert Johnson
Fuenteovejuna
 
Интеграция открытых технологий и взаимодействие со сторонними проектами в усл...
Fuenteovejuna
 
Shared Personalization Service - How To Scale to 15K RPS, Patrice Pelland
Fuenteovejuna
 
Оптимизация одного из топовых приложений для социальной сети ВКонтакте: 1000 ...
Fuenteovejuna
 
Практическое создание крупного масштабируемого web 20 c нуля, Дмитрий Бородин
Fuenteovejuna
 
Social Monitoring Tool codename Looking Glass, Patrice Pelland
Fuenteovejuna
 
Профилирование памяти в приложениях на Python, Антон Грицай
Fuenteovejuna
 
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Fuenteovejuna
 
Использование 0MQ для построения low latency распределёных систем, Андрей Охл...
Fuenteovejuna
 
Некоторые аспекты влияния сходимости протокола BGP на доступность сетевых рес...
Fuenteovejuna
 
Тандемные DDoS-атаки. Проблематика уязвимостей в спецификации TCP IP (фундаме...
Fuenteovejuna
 
Динамика DDoS-атак в России, Александр Лямин
Fuenteovejuna
 
Extreme Cloud Storage on FreeBSD, Андрей Пантюхин
Fuenteovejuna
 
Мониторинг XXI-век, Алиса Смирнова, Дима Никоненко
Fuenteovejuna
 
Native Client, Евгений Эльцин
Fuenteovejuna
 
Tarantool Silverbox, Юрий Востриков
Fuenteovejuna
 
Real time indexes in Sphinx, Yaroslav Vorozhko
Fuenteovejuna
 
Sphinx для высоко-нагруженных и масштабируемых проектов, Вячеслав Крюков
Fuenteovejuna
 
Масштабируемая система голосования на базе PostgreSQL PgQ, Сергей Нековаль
Fuenteovejuna
 
Вы решили написать собственное хранилище, Илья Космодемьянский
Fuenteovejuna
 
Ad

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