Devel.cz Lupa Měšec Podnikatel Root Zdroják.cz DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

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.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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.

Jakub Onderka

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

Školení: Návrh a používání MySQL databáze

 

Naučte se používat jednu z nejrozšířenějších databází. Dozvíte se vše potřebné od návrhu až po samotné využití MySQL v projektech.

Školení pro všechny, kteří se chtějí naučit efektivně pracovat s MySQL nebo se v práci s touto databází zlepšit.

Přihláška a podrobné informace

Přehled názorů

bastl
belzebub 27. 1. 2011 00:23
Nový
├ 
Re: bastl
Michal Kočárek 27. 1. 2011 00:39
Nový
│
└ 
Re: bastl
belzebub 27. 1. 2011 00:50
Nový
│
 
├ 
Re: bastl
Michal 27. 1. 2011 01:05
Nový
│
 
├ 
Re: bastl
JS 27. 1. 2011 05:24
Nový
│
 
├ 
Re: bastl
Tomáš Kafka 27. 1. 2011 10:15
Nový
│
 
│
└ 
Re: bastl
Michal 27. 1. 2011 10:37
Nový
│
 
└ 
Re: bastl
Michal Kočárek 27. 1. 2011 14:20
Nový
│
 
 
└ 
Re: bastl
Kit 29. 1. 2011 20:18
Nový
│
 
 
 
└ 
Re: bastl
Jakub Onderka 29. 1. 2011 20:53
Nový
│
 
 
 
 
└ 
Re: bastl
Kit 29. 1. 2011 21:16
Nový
└ 
Re: bastl
Michal Illich 27. 1. 2011 09:37
Nový
Wikipedie
Miloslav Ponkrác 27. 1. 2011 00:38
Nový
└ 
Re: Wikipedie
JAM3SoN 27. 1. 2011 00:42
Nový
Wiki
Hrach 27. 1. 2011 00:50
Nový
└ 
Re: Wiki
Tomáš 27. 1. 2011 08:33
Nový
 
└ 
Re: Wiki
mormegil 27. 1. 2011 12:01
Nový
Díky
Václav Novotný 27. 1. 2011 08:50
Nový
Re: PHP v rytmu Hip Hopu
David Majda 27. 1. 2011 09:31
Nový
Nette na HipHopu
Vít Šesták (v6ak) 27. 1. 2011 09:40
Nový
└ 
Re: Nette na HipHopu
JakubS 27. 1. 2011 12:51
Nový
 
└ 
Re: Nette na HipHopu
Vít Šesták (v6ak) 27. 1. 2011 14:21
Nový
PHP vs. V8: jiná situace
Vít Šesták (v6ak) 27. 1. 2011 09:52
Nový
Re: PHP v rytmu Hip Hopu
TkTz 27. 1. 2011 09:55
Nový
pěkný článek o technologiích Facebooku
boban 27. 1. 2011 10:00
Nový
Upozornění na překlep
jxp 27. 1. 2011 11:07
Nový
├ 
Re: Upozornění na překlep
Václav Novotný 27. 1. 2011 11:17
Nový
└ 
Re: Upozornění na překlep
sidik 27. 1. 2011 14:35
Nový
 
├ 
Re: Upozornění na překlep
Petr Mejzlík 27. 1. 2011 18:22
Nový
 
│
└ 
Re: Upozornění na překlep
sidik 28. 1. 2011 09:25
Nový
 
│
 
└ 
Re: Upozornění na překlep
pytel 28. 1. 2011 12:17
Nový
 
│
 
 
└ 
Re: Upozornění na překlep
registrovaný uživatel 28. 1. 2011 23:07
Nový
 
└ 
Re: Upozornění na překlep
Kit 29. 1. 2011 20:34
Nový
 
 
└ 
Re: Upozornění na překlep
Jan Seidl 31. 1. 2011 00:21
Nový
Podstata veci
Jano 27. 1. 2011 11:50
Nový
Špatně zvolený název
cleb 27. 1. 2011 12:50
Nový
└ 
Re: Špatně zvolený název
jos 27. 1. 2011 18:30
Nový
 
└ 
Re: Špatně zvolený název
cleb 27. 1. 2011 19:36
Nový
 
 
├ 
Re: Špatně zvolený název
Tschello 27. 1. 2011 20:46
Nový
 
 
│
└ 
Re: Špatně zvolený název
Petr Mejzlík 27. 1. 2011 22:30
Nový
 
 
├ 
Re: Špatně zvolený název
Petr Mejzlík 27. 1. 2011 22:29
Nový
 
 
└ 
Re: Špatně zvolený název
jos 27. 1. 2011 23:12
Nový
 
 
 
└ 
Re: Špatně zvolený název
cleb 27. 1. 2011 23:36
Nový
 
 
 
 
└ 
Re: Špatně zvolený název
jos 28. 1. 2011 01:16
Nový
wtf?
Vaclav Balak 27. 1. 2011 13:51
Nový
└ 
Re: wtf?
Martin 27. 1. 2011 15:32
Nový
 
└ 
Re: wtf?
Vaclav Balak 27. 1. 2011 15:39
Nový
 
 
└ 
Re: wtf?
Petr Mejzlík 27. 1. 2011 22:33
Nový
 
 
 
└ 
Re: wtf?
Jakub Onderka 27. 1. 2011 23:31
Nový
bCompiler
kochi 28. 1. 2011 17:02
Nový
├ 
Re: bCompiler
Jakub Onderka 28. 1. 2011 17:07
Nový
└ 
Re: bCompiler
jos 31. 1. 2011 17:57
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem