Hiphop for php facebook

HipHop for PHP, Facebook unveils it’s magic

After many days of speculations all around the web about Facebook’s rewrite of PHP, today Haiping Zhao from the Facebook team has announced “HipHop for PHP”. The basic idea of HipHop for PHP is that it turns the code you write in PHP into C++ which then can be turned into machine code.

Even though there are others idea that have tried accomplishing the same goal as HipHop for PHP, I believe it is quite safe to assume that Facebook has a large enough user-base to produce code that is solid enough to run and can run well.

The announcement has been made on the Facebook blog earlier today, and tonight there is going to be the video tech talk that everybody can watch:

This evening we’re hosting a small group of developers to dive deeper into HipHop for PHP and will be streaming this tech talk live. Check back here around 7:30pm Pacific time if you’d like to watch.

A few questions come to mind even though we haven’t seen the code just yet. My main concern though is the one of buffer overflows and the security implications of turning PHP code into C++. As they say on the blog, it took nearly 18 months before having a relatively stable version and 3 developers. This is a very short lapse of time to develop a solution used by so many.

Читайте также:  Проверить создана ли папка python

Another interest of mine related to this release is how does it compete with the likes of phc or roadsend php. If it does at all.

However I have noticed on their blog that Facebook has also developed HPHPi which seems to let you use HipHop but without having to actually compile your code before running it (The concept seems a bit like APC’s stat on and off switch from the few lines of description), which seems like a quite interesting idea for the development stages.

Источник

Facebook ускорил PHP в девять раз благодаря HipHop VM

Компания Facebook продолжает работу по повышению производительности кода PHP. В 2010 году они выпустили компилятор HipHop (HPHPc), который транслировал PHP в C++, жертвуя некоторыми редко используемыми функциями PHP вроде eval() , но повышая производительность.

С активной аудиторией в 1,1 млрд человек, Facebook крайне заинтересован в увеличении производительности веб-приложений. Поскольку многие программисты хорошо знакомы с PHP, компания решила не отказываться от этого «медленного» языка, а постараться максимально оптимизировать его. Кстати, так же делает и «Вконтакте» с недавно представленной технологией kPHP.

Впрочем, прежний подход по трансляции кода PHP в C++ пришлось оставить. Вместо этого выпущены виртуальная машина, окружение и JIT-компилятор для PHP под названием HipHop VM for PHP или просто HHVM. Здесь речь идёт о повышении производительности в пять-девять раз.

В мае серверы Facebook почти полностью перешли с HPHPc на HHVM. На Github выложен исходный код виртуальной машины и уже готовые собранные пакеты для Ubuntu 12.04, Debian 7 (wheezy) и Centos 6.4. Скоро обещают добавить пакет для FreeBSD 9.

По словам представителя Facebook, который недавно выступал на конференции O’Reilly Open Source Conference (OSCON), для стандартного веб-сайта, например, на хостинге WordPress, повышение производительности будет небольшим: всего в пять раз. Другое дело, если речь идёт о большой кодовой базе PHP, именно для такой оптимизирована виртуальная машина HHVM, так что здесь возможен рост производительности в девять раз.

«Если вы возьмёте какой-то код PHP и запустите его на HipHop, то CPU не будет ограничивающим фактором производительности, — говорит Джоэл Побар (Joel Pobar), менеджер по разработке Facebook. — Скорее вы увидите, что система тратит больше времени на запросы к базе данных или общение с memcache».

HHVM работает по образцу JVM (Java Virtual Machine): JIT-компилятор транслирует исходный код в машинные коды, когда это нужно, и позволяет учитывать различные факторы при генерации машинного кода. Например, если там вызов к базе данных MySQL, то JIT-компилятор посмотрит, какой тип данных вызывается, и сгенерирует соответствующий код на лету.

Источник

Сборка и запуск HipHop-PHP

Почти три недели назад был анонсирован новый проект от Facebook. Он называется HipHop-PHP.
Для широкой публики исходные коды стали доступны лишь сутки назад.

HipHop был создан для улучшения производительности Facebook. Он преобразует PHP код в C++ код и комплирует его с помощью g++. HipHop доступен под opensource лицензией.

В данной статье описан процесс сборки HipHop из исходных кодов и его использование.

Процесс сборки

1. Клонируем репозиторий

$ git clone git://github.com/facebook/hiphop-php

2. Устанавливаем необходимые библиотеки

Установите неоходимые библиотеки, указанные в http://wiki.github.com/facebook/hiphop-php/building-and-installing. Обратите внимание на минимальные версии.

  1. Для TBB(Thread Building Blocks) минимальная версия 2.2, хоть это и не написано
  2. Необходимо пересобрать libcurl и libevent с патчами от разработчиков
    Если увидели сообщение «struct evhttp_request has no member named ext_method» — значит, у вас не пропатченный libevent
  3. Мне также потребовалось установить Google Perftools

3. Устанавливаем библиотеку libmbfl

$ cd hiphop-php
$ git submodule init
$ git submodule update

4. Настраиваем переменные окружения

$ export HPHP_HOME=`pwd`
$ export HPHP_LIB=`pwd`/bin

5. Перед сборкой

HipHop для сборки использует cmake. В исходном скрипте некоторые библиотеки были пропущены.
Чтобы это исправить, устанавливаем патч:

6. Если у вас 32-битная система

HipHop изначально написан под 64-битную архитуктуру. Если у вас 32-битная, то нужно установить патчи:

7. Сборка

Дополнение для пользователей Debian, Ubuntu и других

Процесс установки хорошо описан здесь, но не забудьте про патчи для 32-битной системы.

Запуск

$ time ./hphp index.php --keep-tempdir=1 --log=3 running hphp. creating temporary directory /tmp/hphp_71TLF1 . parsing inputs. parsing ./index.php. parsing inputs took 0'00" (6 ms) (null) pre-optimizing. pre-optimizing took 0'00" (0 ms) (null) inferring types. inferring types took 0'00" (0 ms) (null) post-optimizing. post-optimizing took 0'00" (0 ms) (null) creating CPP files. creating CPP files took 0'00" (213 ms) (null) compiling and linking CPP files. compiling and linking CPP files took 1'30" (90733 ms) (null) running executable /tmp/hphp_71TLF1/program --file index.php. Hello HipHopall files saved in /tmp/hphp_71TLF1 . running hphp took 1'31" (91747 ms) (null) real 1m31.791s user 1m21.157s sys 0m6.500s
$ ls -l /tmp/hphp_71TLF1/ итого 25152 -rw-r--r-- 1 20673 Фев 21 12:19 CMakeCache.txt drwxr-xr-x 6 4096 Фев 21 12:21 CMakeFiles -rw-r--r-- 1 1558 Фев 21 12:19 cmake_install.cmake -rw-r--r-- 1 2518 Фев 21 12:19 CMakeLists.txt -rw-r--r-- 1 18343 Фев 21 12:19 Makefile drwxr-xr-x 2 4096 Фев 21 12:19 php -rwxr-xr-x 1 25653366 Фев 21 12:21 program drwxr-xr-x 2 4096 Фев 21 12:19 sys $ ls -l /tmp/hphp_71TLF1/php итого 12 -rw-r--r-- 1 783 Фев 21 12:19 index.cpp -rw-r--r-- 1 415 Фев 21 12:19 index.fw.h -rw-r--r-- 1 475 Фев 21 12:19 index.h

Cодержимое файла /tmp/hphp_71TLF1/index.c:

  1. #include
  2. #include
  3. namespace HPHP
  4. ///////////////////////////////////////////////////////////////////////////////
  5. /* preface starts */
  6. /* preface finishes */
  7. Variant pm_php$index_php ( bool incOnce /* = false */ , LVariableTable * variables /* = NULL */ )
  8. FUNCTION_INJECTION ( run_init :: index . php ) ;
  9. DECLARE_GLOBAL_VARIABLES ( g ) ;
  10. bool & alreadyRun = g — > run_pm_php$index_php ;
  11. if ( alreadyRun )
  12. else alreadyRun = true ;
  13. if ( ! variables ) variables = g ;
  14. >
  15. DECLARE_GLOBAL_VARIABLES ( g ) ;
  16. LVariableTable * gVariables __attribute__ ( ( __unused__ ) ) = get_variable_table ( ) ;
  17. print ( «Hello HipHop» ) ;
  18. return true ;
  19. > /* function */
  20. ///////////////////////////////////////////////////////////////////////////////
  21. >

В итоге скомплированная программа занимает целых 25 мегабайт.
Но помимо консольного режима, ее можно запустить в режиме веб-сервиса:

/tmp/hphp_71TLF1/program -m server -p 8080

и лицезреть приветсвие по адресу localhost:8080/index.php

Update. Оценка производительности

Конфигурация

Processor: 2x Intel® Pentium® Dual CPU T2370 @ 1.73GHz
Operating System: Debian GNU/Linux squeeze/sid
Apache/2.2.14 (Debian) with modphp
PHP 5.2.12-2 with Suhosin-Patch 0.9.7 (cli) (built: Jan 11 2010 17:30:06)
gcc version 4.4.3 20100108 (prerelease) (Debian 4.4.2-9)

Тест №1. «В лоб»

$ time php test.php answer: 39 real 0m32.308s user 0m32.258s sys 0m0.012s $ time /tmp/hphp_4C67mv/program --file test.php answer: 39 real 1m6.683s user 1m6.376s sys 0m0.168s $ g++ test.cpp $ time ./a.out answer: 39 real 0m1.758s user 0m1.744s sys 0m0.000s

Тест №2. Apache Benchmark

Запуск HipHop в режиме веб-сервиса:

$ ./program -m server -p 8080 $ ab -n 1000 -c 5 http://127.0.0.1:8080/test.php Concurrency Level: 5 Time taken for tests: 67.019 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 1166084000 bytes HTML transferred: 1166000000 bytes Requests per second: 14.92 [#/sec] (mean) Time per request: 335.096 [ms] (mean) Time per request: 67.019 [ms] (mean, across all concurrent requests) Transfer rate: 16991.44 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 2 Processing: 124 335 56.5 340 477 Waiting: 120 329 56.2 335 467 Total: 124 335 56.5 341 477

Запуск стандартного PHP c помощью Apache with modphp:

$ ab -n 1000 -c 5 http://127.0.0.1:80/test.php . Concurrency Level: 5 Time taken for tests: 27.180 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 1139183000 bytes HTML transferred: 1139000000 bytes Requests per second: 36.79 [#/sec] (mean) Time per request: 135.901 [ms] (mean) Time per request: 27.180 [ms] (mean, across all concurrent requests) Transfer rate: 40929.90 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.5 0 11 Processing: 52 136 32.2 137 216 Waiting: 0 3 1.5 3 17 Total: 52 136 32.2 137 216

Тест №3. Fractal Benchmark

Language Time Relative Speed
C gcc-4.4.3 0.05 seconds 1.00 x
HipHop 0.18 seconds 3.60 x
Python 2.51 2.35 seconds 47.00 x
PHP 5.2.12 3.08 seconds 61.60 x

Выводы (личное мнение)

В двух тестах он оказался почти в два раза медленней стандартного PHP. Но не стоит забывать, что это всего лишь первая версия. Сам процесс сборки HipHop довольно тяжелый, а как таковой установки вообще нет. Установить его можно лишь для того, чтобы понять возможность трансформирования вашего PHP-приложения в C++. Явный минус HipHop — это отсутствие поддержки PostgreSQL (пока только MySQL) и отсутствие возможности подключить существующие PHP-модули. Надеюсь что у этого проекта все еще в впереди.

На этом все. Подробней про запуск HipHop можно прочитать здесь.

  1. http://github.com/h4ck3rm1k3/hiphop-php/ — содержит дополнения для сборки deb-пакета
  2. http://github.com/sanxiyn/hiphop-php/tree/32bit — содержит уже установленные патчи для 32-битной версии

Источник

Оцените статью