PHP v rytmu Hip Hopu

Jazyk PHP je široce používaný, ale jeho výkon nepatří mezi jeho nejsilnější stránky. V rychlosti programovacích jazyků často dokonce zaujímá jedno z posledních míst. Vylepšit se to snaží nástroj z dílen Facebooku s názvem HipHop. Jedná se o převodník PHP skriptů do C++ a v článku si ukážeme, jak jej použít.

Vývojáři Facebooku se potýkali s výkonnostními problémy PHP, které používají pro generování frontendu Facebooku, a proto začali přepisovat kritické části aplikace do C++. Kód v C++ lze s PHP spojit skrz systém rozšíření, to se ale ukázalo jako problematické – jedna aplikace je tak psána zároveň ve dvou jazycích a ve dvou týmech, navíc jsou C++ programátoři dražší.

Řešením by tedy mohlo být přepsání části PHP, což by ovšem prý přineslo zrychlení jen o několik procent (zde je možné zapochybovat, protože například JavaScript v prohlížeči Google Chrome je několikrát rychlejší než PHP). Nakonec se tedy rozhodli vytvořit HipHop – převodník PHP skriptů do jazyka C++, který se po kompilaci vykonává mnohem rychleji. Podle slov jeho vývojářů snížil zátěž serverů o polovinu.

Princip funkce

Běžné zpracování PHP skriptů prochází přes několik vrstev. Nejprve se projde zdrojový kód, které se převede do jednotlivých jazykových elementů, tzv. tokenů. Z nich kompilátor vygeneruje bajtkód, tedy kód obsahující instrukce virtuálního stroje. Ten je zpracovává a převádí na instrukce procesoru, které se přímo vykonávají. Tento postup se nazývá interpretace a provádí se pro každý požadavek a každý vložený soubor.

Pro urychlení tohoto postupu se začaly používat PHP akcelerátory (například APC nebo eAccelerator), které v paměti uchovávají již zkompilovaný bajtkód, odpadá tedy načtení souboru, jeho parsování a kompilace.

HipHop tento postup kompletně obchází a používá vlastní. Zdrojový soubor zparsuje, provede optimalizace, určí datové typy, znovu zoptimalizuje a uloží jako zdrojový kód jazyka C++. Ten se poté zkompiluje pomocí běžného kompilátoru g++ (součást GCC), takže výsledný program obsahuje přímo nativní strojový kód pro cílový procesor. Tento postup se, na rozdíl od interpretace bajtkódu, provede pouze jednou, což výrazně zrychluje běh programu.

Omezení

Celé by to znělo příliš jednoduše, kdyby s kompilovaným přístupem nepřišla také některá omezení. HipHop podporuje pouze Unixové operační systémy (Linux, Mac OS X, BSD, …) a to pouze v 64bitové variantě. Navíc v současné verzi nedokáže fungovat s web serverem Apache; místo toho zkompilovaná aplikace přímo obsahuje HTTP server.

Další omezení jsou kladena přímo na PHP aplikaci, kterou chceme použít: oficiálně podporuje pouze vlastnosti z verze 5.2 (některé vlastnosti 5.3 již fungují, například anonymní funkce), většina PHP rozšíření není podporovaná, dokonce jsou podporovány pouze dvě databáze – MySQL a SQLite – a neexistují některé další funkce, obsažené přímo v PHP (třeba  function_exists).

Donedávna také nefungovaly „zlé“ funkce eval a create_function. Nyní už fungují, i když  kvůli nim musí HipHop obsahovat i interpret HPHPi. Takto vykonávaný kód ale nijak nevyužije výhod kompilace a je tedy mnohem pomalejší než zkompilovaná varianta.

Pozn.: Tyto funkce by se měly s obezřetností používat i při interpretování – nelze je uchovávat v cache bajtkódu a musí se tedy pokaždé parsovat znovu.

Naopak přímo obsažena jsou rozšíření, které pocházejí od Facebooku – XHProf a XHP.

Také je nutné mít na mysli, že jakákoliv změna kódu znamená překompilování celého projektu. Problematické jsou tedy například šablony v PHP kódu.

Instalace

HipHop se nedodává jako binární balíček a neoficiálně snad existuje pouze pro CentOS. Pro všechny ostatní systémy si musíte ručně zkompilovat aktuální git verzi (zatím neexistuje stabilní verze), což je na průměrném počítači „zábava“ na několik hodin. Pro kompilaci jsou vyžadovány asi dvě desítky závislostí. Nejjednodušší je kompilace na Ubuntu 10.10, protože autoři k ní dávají přímo návod a většina závislostí je dostupná ve výchozích repozitářích.

Výkon

Pozn.: Test byl prováděn na 64bitové distribuci Ubuntu 10.10 spuštěnou ve VirtualBoxu na MacBooku s 4 GB RAM, 2,2 GHz procesorem a 64bitového Mac OS X 10.6.

Nejdůležitější vlastností HipHopu je výkon výsledné aplikace. Pro porovnání jsem si vybral svou implementaci souborového žurnálu v Nette, který využívá struktury B+ stromu.

Kompilovaná verze tedy přinesla zrychlení přibližně o 40 %.

Takový žurnál ovšem není zrovna typické použití, mnohem důležitější je výkon reálných aplikací – například generování stránky s článek redakčního systému WordPress. Pro jeho kompilaci je ale potřeba použít mírně opravenou verzi.

Graf ukazuje, kolik server zvládl zobrazit stránek za sekundu, když se na něj zároveň posílalo 10 požadavků. Více než trojnásobné zrychlení přineslo použití cache bajtkódu, použití HipHopu dokonce více než osminásobné, resp. trojnásobné oproti verzi s cache.

Kompilace WordPressu trvala skoro hodinu a výsledná aplikace má 70 MB. Ta ovšem obsahuje už vše potřebné, včetně webového serveru, a lze ji jednoduše přenést na jiný server se stejným operačním systémem.

Chtěl jsem také otestovat HipHop na kompilaci Nette frameworku, to by si ale vyžádalo jeho částečné přepsání. Navíc tento framework cachuje šablony do PHP, což u kompilované verze nejde, ale šlo by pravděpodobně obejít pomocí funkce eval. – pozn.aut.

Závěr

Od HipHopu nelze očekávat, že se stane masově používaný. Má celkem specifické použití tam, kde současná infrastruktura už nestačí – po jeho aplikaci teoreticky stačí o polovinu méně výkonu pro vyřízení stejného množství požadavků. Žhavý kandidát na jeho nasazení je podle mne Wikipedie, která často trpí pomalostí generování stránek a systém MediaWiki, který ji pohání, je napsán právě v PHP.

Studuje Fakultu elektrotechniky a komunikačních technologií VUT v Brně a na volné noze programuje efektivní aplikace převážně v jazyce PHP.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 52

Přehled komentářů

belzebub bastl
Michal Kočárek Re: bastl
belzebub Re: bastl
Michal Re: bastl
JS Re: bastl
keff Re: bastl
Michal Re: bastl
Michal Kočárek Re: bastl
Kit Re: bastl
Jakub Onderka Re: bastl
Kit Re: bastl
Michal Illich Re: bastl
alancox Wikipedie
JAM3SoN Re: Wikipedie
Hrach Wiki
Tomáš Re: Wiki
mormegil Re: Wiki
drevolution Díky
David Majda Re: PHP v rytmu Hip Hopu
v6ak Nette na HipHopu
JakubS Re: Nette na HipHopu
v6ak Re: Nette na HipHopu
v6ak PHP vs. V8: jiná situace
TkTz Re: PHP v rytmu Hip Hopu
boban pěkný článek o technologiích Facebooku
jxp Upozornění na překlep
drevolution Re: Upozornění na překlep
sidik Re: Upozornění na překlep
imploder Re: Upozornění na překlep
sidik Re: Upozornění na překlep
pytel Re: Upozornění na překlep
registrovaný uživatel Re: Upozornění na překlep
Kit Re: Upozornění na překlep
viroman Re: Upozornění na překlep
Jano Podstata veci
cleb Špatně zvolený název
jos Re: Špatně zvolený název
cleb Re: Špatně zvolený název
Tschello Re: Špatně zvolený název
imploder Re: Špatně zvolený název
imploder Re: Špatně zvolený název
jos Re: Špatně zvolený název
cleb Re: Špatně zvolený název
jos Re: Špatně zvolený název
shMoula wtf?
Martin Re: wtf?
shMoula Re: wtf?
imploder Re: wtf?
Jakub Onderka Re: wtf?
kochi bCompiler
Jakub Onderka Re: bCompiler
jos Re: bCompiler
Zdroj: https://www.zdrojak.cz/?p=3415