• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

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

on

  • 5,325 views

 

Statistics

Views

Total Views
5,325
Views on SlideShare
5,325
Embed Views
0

Actions

Likes
1
Downloads
24
Comments
1

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • На слайде 48 видно что HipHop не быстрее Apache+APC (до 250 одновременных запросов), а php-fpm + apc тормоз на их фоне.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • Компиляция скриптов 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 Zend Engine (Request management, (Compile & execute, files, network) memory management)
    • Как работает 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...)
    • Процесс выполнения скрипта  Лексический анализ Процесс конвертации кода из набора символов в набор токенов
    • Процесс выполнения скрипта  Лексический анализ  Синтаксический анализ Происходит анализ токенов для определения их грамматической структуры
    • Процесс выполнения скрипта  Лексический анализ  Синтаксический анализ  Генерация байткода На основе лексического и синтаксического анализа генерится байт код
    • Процесс выполнения скрипта  Лексический анализ  Синтаксический анализ  Генерация байткода  Выполнение байткода
    • Каждый раз одно и то же! Это медленно :-(
    • Ускоряем  Кеш байткода (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