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

Post on 14-Dec-2014

4.728 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

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(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 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-скриптов, которые будут компилироваться.

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_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

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

HipHop: statusGET 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 StatsMemCache StatsAPC StatsMemory StatsPage Sectionsevhttp Stats:Application Stats ( hphp_stats($key, $count); )

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

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]}

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

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

top related