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

PPTX
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
PDF
JPHP - О проекте на простом языке
PDF
Семь тысяч Rps, один go
PDF
Web осень 2013 лекция 1
PPT
PHP: SAPI
PDF
2014.10.15 Сергей Бурладян, Avito.ru
PDF
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
PPTX
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Быстрое развёртывание шаблонов и статики в Mail.ru, Николай Кондратов
JPHP - О проекте на простом языке
Семь тысяч Rps, один go
Web осень 2013 лекция 1
PHP: SAPI
2014.10.15 Сергей Бурладян, Avito.ru
2014.10.15 Мурат Кабилов, Avito.ru #PostgreSQLRussia
Автоматизация тестирования клиентской производительности / Николай Лавлинский...

What's hot (20)

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

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

PDF
Компиляция скриптов PHP (Алексей Романенко)
PDF
Как мы делаем модули PHP в Badoo – Антон Довгаль
PPTX
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
PDF
PHP 5.4 - особенности перехода
PPT
Воюем за ресурсы (ZFConf2011)
PPTX
Микрофреймворки PHP
PPT
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
PPTX
Язык программирования PHP
PDF
Веб-сервер
PDF
Роман Еникеев - PHP или откуда взялся слон
PPTX
Php and frameworks
PPTX
Язык программирования PHP. EasyCode. Стартовая презентация.
PPT
The basic design of the PHP language
PPTX
PHP 5.4: Что нового?
PPTX
06 php instalation_ru
PPTX
Codeception Introduction
PPTX
PHP basic
PDF
Релиз PHP7 - что нас ждет в октябре 2015
Компиляция скриптов PHP (Алексей Романенко)
Как мы делаем модули PHP в Badoo – Антон Довгаль
2015-12-12 | AzovDevMeetup 2015 | Enterprise приложения на PHP | Павел Крынецкий
PHP 5.4 - особенности перехода
Воюем за ресурсы (ZFConf2011)
Микрофреймворки PHP
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
Язык программирования PHP
Веб-сервер
Роман Еникеев - PHP или откуда взялся слон
Php and frameworks
Язык программирования PHP. EasyCode. Стартовая презентация.
The basic design of the PHP language
PHP 5.4: Что нового?
06 php instalation_ru
Codeception Introduction
PHP basic
Релиз PHP7 - что нас ждет в октябре 2015
Ad

More from Fuenteovejuna (20)

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

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