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

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

Upload: ontico

Post on 14-Dec-2014

4.728 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

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

Компиляция скриптов PHP

Алексей Романенко (РБК)

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

Зачем?

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

Как работает PHP

Server API (SAPI)(mod_php, FastCGI, CLI...)

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

Как работает PHP

Server API (SAPI)(mod_php, FastCGI, CLI...)

PHP Core(Request management,

files, network)

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

Как работает PHP

Server API (SAPI)(mod_php, FastCGI, CLI...)

PHP Core(Request management,

files, network)

Zend Engine(Compile & execute,

memory management)

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

Как работает 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...)

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

Процесс выполнения скрипта Лексический анализ

Процесс конвертации кода из набора символов в набор токенов

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

Процесс выполнения скрипта Лексический анализ Синтаксический анализ

Происходит анализ токенов для определения их грамматической структуры

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

Процесс выполнения скрипта Лексический анализ Синтаксический анализ Генерация байткода

На основе лексического и синтаксического анализа генерится байт код

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

Процесс выполнения скрипта Лексический анализ Синтаксический анализ Генерация байткода Выполнение байткода

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

Каждый раз одно и то же!

Это медленно :-(

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

Ускоряем

Кеш байткода (APC, eAccelerator, Xcache, Zend Accelerator) Написание расширений (C) Переписать все на C/C++ Компилировать php-код куда-то и во что-то

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

А давайте что-нибудь скомпилируем!

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

Компиляция

Native code Non-native code

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

Native code

Roadsend PHP Raven PHC (PHP Open Source compiler) HipHop

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

Non-native code

Java bytecode Quercus Project Zero

.NET Phalanger

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

Roadsend PHP

Разработка началась в 2002 OpenSource с 2007 Использует компилятор Bigloo для языка Scheme Не использует Zend Engine

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

Roadsend PHP

Standalone binaries Модуль для Apache Standalone web-server

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

Roadsend PHP

Не работает!

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

Raven (rphp)

Это Roadsend, переписанный на C++ и использующий LLVM в качестве генератора кода.

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

Raven (rphp)

Under construction

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

phc

OpenSource с 2005 Использует PHP embeded SAPI Standalone binary executables PHP-code → PHP-extension, C

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

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

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

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

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

phc

Плюсы: Совместимость с “обычным” PHP Поддержка расширений Хорошая документация

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

phc

Минусы: Не полноценный binary executable Зависит от Zend Engine Сложность подключения для web-проектов

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

HipHop

Разработан в Facebook OpenSource с февраля 2010 Транслирует код php в код C++ 100% php-кода компилируется через HipHop Заявлено снижение CPU на 50%

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

HipHop

Standalone binary executables Multi-threaded Web server Встроенный debuger (local и remote)

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

HipHop: hphp --help--config=FILE

Опции из конфигурационного файла. Файл в формате HDF

--db-config=STRINGЧитает конфигурацию из DB. Строка в формате :@:/.

-l, --log=INT Устанавливает уровень логирован в stdout:0: No logging1: Only errors2: The same as 1 plus warnings.3: The same as 2 plus extra information.4: All log messages.

--input-list=FILEУстанавливает путь к файлу со списком PHP-скриптов, которые будут компилироваться.

Page 30: Компиляция скриптов 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)

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

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

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

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 */

}

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

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

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

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

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

HipHop: statusGET http://[server]:9999/status.[xml|json|html]

Показывает статус запущенных процессов сервера и воркеров.

[process] [id] [build] ... [threads] [thread] [id] [req] ... [thread] ...

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

HipHop: statsСтатистика сервера:GET http://[server]:9999/stats.[fmt]?from=[t1]&to=[t2]&keys=...

Доступные ключи:

SQL StatsMemCache StatsAPC StatsMemory StatsPage Sectionsevhttp Stats:Application Stats ( hphp_stats($key, $count); )

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

HipHop: debug$ ./hphpi -f test.php$ ./hphpi -m debug -f test.php

hphpd> break test.php:5hphpd> break foo()hphpd> runhphpd> print $ahphpd> <?php print $a; ?>hphpd> continuehphpd> quit

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

HipHop: RPC-serverhttp://[server]:[port]/function_name?params=...

params – json-массив

http://[server]:[port]/function_name?p=[json value]&p=[json value]...

Return:array { "return" => [function's return]}

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

HipHop

Не поддерживается: eval() create_function() preg_replace() c /e

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

HipHop

Плюсы: Активно развивается + поддержка Facebook

Native code

Прирост производительности, снижение CPU

Гибкость в конфигурации, администрированию и debug

Много дополнительных возможностей

Неплохая документация

Production-ready

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

HipHop

Минусы: Сложность сборки, ряд ограничений 32bit support experimental Поддержка модулей ограничена Нет поддежки PHP 5.3 (скоро)

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

HipHop

Не ускоряет ваши SQL-запросы Не ускоряет загрузку картинок и статического контента Не улучшает отладку Это не silver bullet для PHP

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

HipHop

Снижение CPU → уменьшение кол-во серверов

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

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";

?>

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

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 сек

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

Benchmark #2http://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 сек

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

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

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

Benchmark #3

HTML-страница, 10 include “*.php”, rps

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

Так что же выбрать?Компилировать или нет?

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

1. Упираемся в CPU 100%

2. Автономность вашего приложения

3. Снижение кол-ва серверов

4. Много php-кода, который лень переписывать

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

СсылкиRoadsend http://code.roadsend.com/pcc

phc http://www.phpcompiler.org/

HipHop http://github.com/facebook/hiphop-php/wiki

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

СПАСИБО!

Вопросы?

Алексей РоманенкоE-mail: [email protected]