Your SlideShare is downloading. ×
0
Компиляция скриптов
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
(C...
Как работает PHP
Server API (SAPI)
(mod_php, FastCGI, CLI...)
PHP Core
(Request management,
files, network)
Zend Engine
(C...
Процесс выполнения скрипта

Лексический анализ
Процесс конвертации кода из набора символов в набор
токенов
Процесс выполнения скрипта

Лексический анализ

Синтаксический анализ
Происходит анализ токенов для определения их
грамм...
Процесс выполнения скрипта

Лексический анализ

Синтаксический анализ

Генерация байткода
На основе лексического и синт...
Процесс выполнения скрипта

Лексический анализ

Синтаксический анализ

Генерация байткода

Выполнение байткода
Каждый раз одно и то же!
Это медленно :-(
Ускоряем

Кеш байткода (APC, eAccelerator, Xcache, Zend Accelerator)

Написание расширений (C)

Переписать все на C/C++...
А давайте что-нибудь
скомпилируем!
Компиляция

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

Не использ...
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 ...
phc / web-app
$ phc --extension=helloworld --generate-c helloworld.php > ext/helloworld.c
$ phpize --with-php-config=/usr/...
phc
Плюсы:

Совместимость с “обычным” PHP

Поддержка расширений

Хорошая документация
phc
Минусы:

Не полноценный binary executable

Зависит от Zend Engine

Сложность подключения для web-проектов
HipHop

Разработан в Facebook

OpenSource с февраля 2010

Транслирует код php в код C++

100% php-кода компилируется ч...
HipHop

Standalone binary executables

Multi-threaded Web server

Встроенный debuger (local и remote)
HipHop: hphp --help
--config=FILE
Опции из конфигурационного файла. Файл в формате HDF
--db-config=STRING
Читает конфигура...
HipHop: hphp
$ hphp hello.php --keep-tempdir=1 –log=3
running hphp...
creating temporary directory /tmp/hphp_AZ4F7V ...
pa...
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...
HipHop
$ cat /tmp/hphp_AZ4F7V/php/hello.cpp
#include <php/hello.h>
#include <php/hello.fws.h>
#include <runtime/ext/ext.h>...
HipHop: ./program --help
-m, --mode
run: (default) directly executes the program from command line.
debug: starts debugger...
HipHop: admin server
GET http://localhost:9999
/stop: stop the web server
/status.xml: show server status in XML
/status.j...
HipHop: status
GET http://[server]:9999/status.[xml|json|html]
Показывает статус запущенных процессов сервера и воркеров.
...
HipHop: stats
Статистика сервера:
GET http://[server]:9999/stats.[fmt]?from=[t1]&to=[t2]&keys=...
Доступные ключи:
SQL Sta...
HipHop: debug
$ ./hphpi -f test.php
$ ./hphpi -m debug -f test.php
hphpd> break test.php:5
hphpd> break foo()
hphpd> run
h...
HipHop: RPC-server
http://[server]:[port]/function_name?params=...
params – json-массив
http://[server]:[port]/function_na...
HipHop
Не поддерживается:

eval()

create_function()

preg_replace() c /e
HipHop
Плюсы:

Активно развивается + поддержка Facebook

Native code

Прирост производительности, снижение CPU

Гибкос...
HipHop
Минусы:

Сложность сборки, ряд ограничений

32bit support experimental

Поддержка модулей ограничена

Нет подде...
HipHop

Не ускоряет ваши SQL-запросы

Не ускоряет загрузку картинок и статического контента

Не улучшает отладку

Это ...
HipHop

Снижение CPU → уменьшение кол-во серверов
Benchmark #1
<?php
$r = 0;
for ($i = 0; $i < 10000; $i++) {
for ($j = 0; $j < 10000; $j++) {
$r = ($r + ($i * $j) % 100) %...
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 —...
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...
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. Ngin...
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/...
СПАСИБО!
Вопросы?
Алексей Романенко
E-mail: aromanenko@rbc.ru
Upcoming SlideShare
Loading in...5
×

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

5,072

Published on

Published in: Technology
1 Comment
1 Like
Statistics
Notes
  • На слайде 48 видно что HipHop не быстрее Apache+APC (до 250 одновременных запросов), а php-fpm + apc тормоз на их фоне.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
5,072
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
27
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

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

  1. 1. Компиляция скриптов PHP Алексей Романенко (РБК)
  2. 2. Зачем?
  3. 3. Как работает PHP Server API (SAPI) (mod_php, FastCGI, CLI...)
  4. 4. Как работает PHP Server API (SAPI) (mod_php, FastCGI, CLI...) PHP Core (Request management, files, network)
  5. 5. Как работает PHP Server API (SAPI) (mod_php, FastCGI, CLI...) PHP Core (Request management, files, network) Zend Engine (Compile & execute, memory management)
  6. 6. Как работает 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...)
  7. 7. Процесс выполнения скрипта  Лексический анализ Процесс конвертации кода из набора символов в набор токенов
  8. 8. Процесс выполнения скрипта  Лексический анализ  Синтаксический анализ Происходит анализ токенов для определения их грамматической структуры
  9. 9. Процесс выполнения скрипта  Лексический анализ  Синтаксический анализ  Генерация байткода На основе лексического и синтаксического анализа генерится байт код
  10. 10. Процесс выполнения скрипта  Лексический анализ  Синтаксический анализ  Генерация байткода  Выполнение байткода
  11. 11. Каждый раз одно и то же! Это медленно :-(
  12. 12. Ускоряем  Кеш байткода (APC, eAccelerator, Xcache, Zend Accelerator)  Написание расширений (C)  Переписать все на C/C++  Компилировать php-код куда-то и во что-то
  13. 13. А давайте что-нибудь скомпилируем!
  14. 14. Компиляция  Native code  Non-native code
  15. 15. Native code  Roadsend PHP  Raven  PHC (PHP Open Source compiler)  HipHop
  16. 16. Non-native code Java bytecode  Quercus  Project Zero .NET  Phalanger
  17. 17. Roadsend PHP  Разработка началась в 2002  OpenSource с 2007  Использует компилятор Bigloo для языка Scheme  Не использует Zend Engine
  18. 18. Roadsend PHP  Standalone binaries  Модуль для Apache  Standalone web-server
  19. 19. Roadsend PHP Не работает!
  20. 20. Raven (rphp) Это Roadsend, переписанный на C++ и использующий LLVM в качестве генератора кода.
  21. 21. Raven (rphp) Under construction
  22. 22. phc  OpenSource с 2005  Использует PHP embeded SAPI  Standalone binary executables  PHP-code → PHP-extension, C
  23. 23. 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
  24. 24. 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
  25. 25. phc Плюсы:  Совместимость с “обычным” PHP  Поддержка расширений  Хорошая документация
  26. 26. phc Минусы:  Не полноценный binary executable  Зависит от Zend Engine  Сложность подключения для web-проектов
  27. 27. HipHop  Разработан в Facebook  OpenSource с февраля 2010  Транслирует код php в код C++  100% php-кода компилируется через HipHop  Заявлено снижение CPU на 50%
  28. 28. HipHop  Standalone binary executables  Multi-threaded Web server  Встроенный debuger (local и remote)
  29. 29. 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-скриптов, которые будут компилироваться.
  30. 30. 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)
  31. 31. 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
  32. 32. 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 */ }
  33. 33. 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
  34. 34. 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
  35. 35. HipHop: status GET http://[server]:9999/status.[xml|json|html] Показывает статус запущенных процессов сервера и воркеров. [process] [id] [build] ... [threads] [thread] [id] [req] ... [thread] ...
  36. 36. 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); )
  37. 37. 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
  38. 38. 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] }
  39. 39. HipHop Не поддерживается:  eval()  create_function()  preg_replace() c /e
  40. 40. HipHop Плюсы:  Активно развивается + поддержка Facebook  Native code  Прирост производительности, снижение CPU  Гибкость в конфигурации, администрированию и debug  Много дополнительных возможностей  Неплохая документация  Production-ready
  41. 41. HipHop Минусы:  Сложность сборки, ряд ограничений  32bit support experimental  Поддержка модулей ограничена  Нет поддежки PHP 5.3 (скоро)
  42. 42. HipHop  Не ускоряет ваши SQL-запросы  Не ускоряет загрузку картинок и статического контента  Не улучшает отладку  Это не silver bullet для PHP
  43. 43. HipHop  Снижение CPU → уменьшение кол-во серверов
  44. 44. 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"; ?>
  45. 45. 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 сек
  46. 46. 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 сек
  47. 47. 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
  48. 48. Benchmark #3 HTML-страница, 10 include “*.php”, rps
  49. 49. Так что же выбрать? Компилировать или нет?
  50. 50. 1. Упираемся в CPU 100% 2. Автономность вашего приложения 3. Снижение кол-ва серверов 4. Много php-кода, который лень переписывать
  51. 51. Ссылки Roadsend http://code.roadsend.com/pcc phc http://www.phpcompiler.org/ HipHop http://github.com/facebook/hiphop-php/wiki
  52. 52. СПАСИБО! Вопросы? Алексей Романенко E-mail: aromanenko@rbc.ru
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×