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

14,226 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
14,226
On SlideShare
0
From Embeds
0
Number of Embeds
12,303
Actions
Shares
0
Downloads
10
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Компиляция скриптов 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 Zend Engine(Request management, (Compile & execute, files, network) memory management)
  6. 6. Как работает PHP Server API (SAPI) (mod_php, FastCGI, CLI...) PHP Core Zend Engine(Request management, (Compile & execute, files, network) 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 codeJava 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=3running hphp...creating temporary directory /tmp/hphp_AZ4F7V ...parsing inputs...parsing inputs took 000" (55 ms) (null)pre-optimizing...pre-optimizing took 000" (325 ms) (null)inferring types...inferring types took 000" (134 ms) (null)post-optimizing...post-optimizing took 000" (72 ms) (null)creating CPP files...creating CPP files took 000" (634 ms) (null)compiling and linking CPP files...compiling and linking CPP files took 219" (139099 ms) (null)
  31. 31. 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
  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 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
  35. 35. HipHop: statusGET 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.phphphpd> break test.php:5hphpd> break foo()hphpd> runhphpd> print $ahphpd> <?php print $a; ?>hphpd> continuehphpd> quit
  38. 38. HipHop: RPC-serverhttp://[server]:[port]/function_name?params=... params – json-массивhttp://[server]:[port]/function_name?p=[json value]&p=[json value]...Return: array { "return" => [functions 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 -srvmoLinux 2.6.32-21-generic #32-Ubuntu SMP Fri Apr 16 08:10:02 UTC 2010 i686GNU/Linux1. HipHop — 15,68 сек2. PHP 5.3.2 — 24,79 сек3. phc — 31,2 сек
  46. 46. Benchmark #2http://svn.php.net/viewvc/php/php-src/trunk/Zend/bench.php1. HipHop — 2,879 сек2. phc — 5,66 сек3. PHP 5.3.2 — 8,49 сек
  47. 47. Benchmark #31. Apache/2.2.14 + php-5.3.22. Apache/2.2.14 + php-5.3.2 + APC 3.1.33. Nginx 0.7.65 + php-fpm 5.3.34. Nginx 0.7.65 + php-fpm 5.3.3 + APC 3.1.45. HipHop
  48. 48. Benchmark #3HTML-страница, 10 include “*.php”, rps
  49. 49. Так что же выбрать?Компилировать или нет?
  50. 50. 1. Упираемся в CPU 100%2. Автономность вашего приложения3. Снижение кол-ва серверов4. Много php-кода, который лень переписывать
  51. 51. СсылкиRoadsend http://code.roadsend.com/pccphc http://www.phpcompiler.org/HipHop http://github.com/facebook/hiphop-php/wiki
  52. 52. СПАСИБО! Вопросы? Алексей РоманенкоE-mail: aromanenko@rbc.ru

×