Facebook HipHop-PHP
![]() | Dit topic is bedoeld om ervaringen uit te wisselen over de installatie en het gebruik van Facebook's HipHop bij het coderen en uitvoeren van PHP code. Vragen en problemen met het compileren en draaien van HipHop kunnen hier gesteld worden. Tevens kan er gediscussieerd worden over de zin, onzin en oorzaken achter het gedrag dat deze crosscompiler veroorzaakt. Tot slot is het interessant om over specifieke performance winst of verlies te discussiëren bij bepaalde code implementaties. |
Wat is HipHop?
HipHop maakt van dynamische PHP code geoptimaliseerde maar statische C++ code en compileert het via de GNU C++-compiler G++. Hierdoor zal de algemene performance van de code toenemen volgens Facebook.Er wordt in diverse media gemeld dat Facebook een "eigen" snelle variant van PHP vrijgeeft, maar dit is niet geheel correct. Hoewel Facebook ook een interpreter aanbiedt die rechtstreeks PHP code kan parsen en uitvoeren, is dit niet het hoofddoel van dit project. Deze interpreter is gemaakt voor het debuggen van PHP code en heeft tevens als doel om bugs op te sporen die de crosscompiler onverhoopt introduceert.
Hoe werkt HipHop?
HipHop bestaat na een succesvolle build onder andere uit twee executables:- HPHP
de commandline tool om een of meerdere PHP bestanden te porten naar C++ en deze als één native binary te compilen - HPHPI
de commandline tool om PHP bestanden interpreted (regel voor regel) uit te voeren, waarbij debugging mogelijk is en waarbij de werking van de portering van de code getest kan worden
Om te voorkomen dat de executable verwijderd wordt, kan de vlag --keep-tempdir=1 meegegeven worden. De output directory kan gemanipuleerd worden met de vlag --output-dir.
Een executable is allemaal leuk en aardig, maar verreweg de meestgebruikte functie van PHP is het genereren van webpagina's. Door de executable op te starten van de commandline, zal deze als CLI uitgevoerd worden. Omdat Apache integratie vooralsnog ontbreekt (er zijn plannen voor een FastCGI implementatie) zal de functionaliteit van de code op een andere manier naar de browser toe moeten. De Facebook programmeurs hebben dit opgelost door een multithreaded webserver mee te compilen in de executable. Deze kan getriggered worden met de parameter -m server
Standaard probeert de ingebouwde webserver op poort 80 actief te worden. Vaak is dit niet mogelijk omdat er al een apache instantie draait of omdat de gebruiker geen root is en geen poorten onder de 1024 open mag zetten. In dat geval kan een aparte poort opgegeven worden met parameter -p 8080 voor poort 8080. Tot slot is het mogelijk om de executable in de achtergrond te laden door in de parameter -m het woord server door daemon te vervangen (-m daemon). Verdere informatie is te vinden door hphp --help te gebruiken of op de officiele wiki te kijken
Als een executable als webserver gestart wordt, komt er standaard een aparte administration server actief op poort 8088. Hier kunnen allerlei commando's gegeven worden om statistieken aan of uit te zetten en op te vragen.
Eigenaardigheden van HipHop
Als eerste valt de compile performance op als de tool voor het eerst gebruikt wordt. Bij het uitvoeren van HPHP op een simpel 'Hello World!' PHP bestand is de tool minimaal al een minuut zoet. Ik heb persoonlijk nog geen hands-on ervaring met het compilen van een grote codebaseAls tweede valt de gecompileerde binary op. Het simpele 'Hello World' voorbeeld levert een binary op van maar liefst 29 megabyte.
Wat ook opvalt is dat in simpele voorbeelden al duidelijk blijkt dat de performance negatief afsteekt tegen het regulier draaien van een PHP script. Een voorbeeld hiervan kun je hier vinden.
Tot slot een waarschuwing voor mensen die een 32-bit linux systeem hebben. De huidige HipHop sourcecode is nog niet compatible met 32-bit en kan niet gecompiled worden op deze systemen. Een 64-bit systeem is benodigd om HipHop succesvol te builden.
Installatie van HipHop
Uitgaande van een Red Hat Enterprise Linux (of Centos) server versie 5.4 is hier de lijst van benodigdheden, aangevuld met hoe en waar ik de diverse packages heb gevonden:- cmake 2.6.4 is the minimum version
yum install cmake (standaard repository) - g++/gcc 4.1 is the minimum version
yum install gcc-c++ (standaard repository) - Boost 1.37 is the minimum version
Ik heb versie 1.38 van source gecompiled: http://sourceforge.net/pr...st_1_38_0.tar.gz/download - flex
De versie in de standaard repository is te oud. Ik heb 2.5.35 van source gecompiled: http://www.sfr-fresh.com/unix/misc/flex-2.5.35.tar.gz - bison
yum install bison (standaard repository) - re2c 0.13.0 is the minimum version
yum install re2c (rpmforge repository) - libmysql
yum install mysql mysql-devel (standaard repository) - libxml2
yum install libxml2 libxml2-devel (standaard repository) - libmcrypt
yum install libmcrypt libmcrypt-devel (standaard repository) - libicu 4.2 is the minimum version
Ik heb versie 4.2.1 van source gecompiled: http://download.icu-proje...4.2.1/icu4c-4_2_1-src.tgz - openssl
yum install openssl openssl-devel (standaard repository) - binutils and binutils-dev
yum install binutils binutils-devel (standaard repository) - libcap
yum install libpcap libpcap-devel (standaard repository) - gd
yum install gd gd-devel (standaard repository) - zlib
yum install zlib zlib-devel (standaard repository) - tbb Intel’s Thread Building Blocks
Compiled versie gedownload van: http://www.threadingbuild.../2.2/tbb22_004oss_lin.tgz - libmbfl
Gecompiled van git clone git://github.com/scottmac/libmbfl.git - Oniguruma
Versie 5.9.2 gecompiled van source: http://www.geocities.jp/k...archive/onig-5.9.2.tar.gz - libpcre3
yum install pcre pcre-devel (standaard repository) - libexpat
yum install libexpat libexpat-devel (standaard repository)
http://wiki.github.com/fa...p/building-and-installing
In de installatie instructies staat het git commando git submodule. Het blijkt dat de versie van git uit de standaard repository te oud is en dit commando niet snapt. Om dit commando te kunnen uitvoeren is een update van git nodig. Ik heb dit bereikt door de nieuwste versie van git te compilen. Hier is de link:
http://kernel.org/pub/software/scm/git/git-1.7.0.tar.bz2
Nog te onderzoeken
HipHop is nog erg nieuw en er is behalve bij de Facebook ontwikkelaars nog niet veel bekend over de sterke en zwakke gebieden van deze tool.De volgende items zijn mogelijk interessant om te onderzoeken:
- Testen van de performance winst of verlies van veelgebruikte native PHP commando's
- Performance winst of verlies bij diverse design patterns en implementaties
- Testen van veelgebruikte extensies
- Performance en stress test van de ingebouwde webserver, vergelijken met apache+php
- Onderzoeken van portability van de executable over meerdere distros
- En meer...
De toekomst
Het is inmiddels bekend dat Facebook HipHop geschikt wil maken voor PHP 5.3. Op dit moment is HipHop uitsluitend geschikt om PHP 5.2 code om te zetten.Wat ook is aangekondigd is een FastCGI interface als compile optie in plaats van de ingebouwde webserver. Op die manier kunnen de gecompilede binaries direct door apache aangesproken worden.
Persoonlijk zou ik een CLI only compile optie graag tegemoet zien, waardoor de grootte van de binary hopelijk drastisch afneemt en minder bloated wordt.
Tot slot...
Bij deze dus een uitnodiging om aan de slag te gaan met HipHop en in dit topic uitgebreid je bevindingen te rapporteren. Mocht ik nog dingen in de TS vergeten zijn, slinger dan even een DM mijn kant uit, dan zetten we het erbij.Klik hier om mij een DM te sturen • 3245 WP op ZW