HipHop for PHP

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

HipHop for PHP (v překladu HipHop pro PHP) je aplikace transformující zdrojové kódy psané v jazyce PHP do vysoce optimalizovaného kódu v C++. Byl vyvinut vývojáři Facebooku a vydán v roce 2010 jako open source software.

Pozadí[editovat | editovat zdroj]

Mezi hlavní nevýhody jazyka PHP oproti jiným patří jeho nízká rychlost a vysoká paměťová náročnost. Při nasazení aplikací psaných v tomto programovacím jazyce ve velkém měřítku tyto problémy přestávají být zanedbatelnými. Cílem projektu je zrychlit vykonávání PHP kódu, snížit paměťové nároky, a ušetřit tak nemalé finanční prostředky za hardware, který by byl jinak potřebný pro obsloužení stejného počtu požadavků.

Základní funkcionalita[editovat | editovat zdroj]

HipHop for PHP zadaný zdrojový .php soubor optimalizuje a transformuje do zdrojových souborů .cpp jazyka C++. Ty poté zkompiluje do spustitelné binární podoby. Výsledný spustitelný soubor poté vykonává funkcionalitu původního .php skriptu, či jej lze pomocí přepínačů nastartovat jako webový server, který na určeném portu odpovídá na HTTP požadavky. PHP skriptů lze do jednoho souboru zkompilovat i více, a tak je možné mít jeden spustitelný binární soubor, který v sobě obsahuje funkčnost celé rozsáhlé aplikace.

Proces transformace kódu[editovat | editovat zdroj]

Proces transformace kódu sestává ze tří základních kroků:

  1. Statická analýza PHP kódu, kdy jsou shromažďovány informace o deklaracích proměnných, funkcí a tříd, a jejich vzájemných závislostech,
  2. přiřazení proměnným jejich typ – mezi skalárními typy jazyka C++ je vybrán ten nejspecifičtější použitelný,
  3. vygenerování C++ kódu, který je většinou v přímé korespondenci příkazy a výrazy PHP z původních souborů.

Výsledný kód je poté zkompilován pomocí překladače g++.

Pozadí implementace[editovat | editovat zdroj]

Statická kompilace zdrojových kódu přináší určité výhody a lze proto ušetřit na výkonu na několika místech: Kód nemusí být načítán ze souboru, a poté postupně interpretován vždy znovu od začátku. Přestože PHP poskytuje květnaté možnosti dynamického interpretovaného jazyka, většina kódu je relativně přímočará. Častěji se v něm vyskytují obyčejné podmínky či cykly než dynamicky vytvářené názvy proměnných či tříd, či vkládání souborů do souborů na základě dynamicky generovaných parametrů (což C++ nezná). Právě v takových operacích je kompilovaný kód rychlejší. Kdekoliv je to možné, je použito statické svazování (static binding) proměnných i funkcí. PHP je skriptovací jazyk s dynamickým, slabým typováním proměnných. Oproti tomu je C++ jazyk kompilovaný s typováním statickým. Pro jednotlivé proměnné je tak co nejspecifičtěji vybírán odpovídající datový typ, aby se ušetřila paměť.

Výhody[editovat | editovat zdroj]

  • Zrychlení spouštěného kódu.

Nevýhody[editovat | editovat zdroj]

  • Nutnost obětovat některé vlastnosti jazyka (byť málo často používané) jako např. funkci eval(),
  • lze použít pouze podporovaná rozšíření PHP (funkce využívající knihovny třetích stran),
  • při sebemenší změně zdrojových kódu je třeba spustitelný soubor překompilovat.

Příklady použití[editovat | editovat zdroj]

Po zkompilování zdrojových kódu projektu jsou k dispozici dva spustitelné soubory: hphp a hphpi. Zdrojové PHP kódy cílové aplikace pak mohou být za použití HipHop spuštěny pěti různými způsoby:

  1. Zkompilováním PHP souboru do podoby binárního spustitelného souboru. Při spuštění bez parametrů je funkčnost totožná s původním skriptem.
$ hphp test.php
  1. Zkompilováním PHP souborů do podoby spustitelného souboru, a jeho ruční spuštění:
$ hphp test.php --keep-tempdir=1 --log=3

Zde přepínače --keep-tempdir=1 zapříčiní, že binární soubor není po skončení kompilace spuštěn, ale uchován, a díky --log=3 hphp přidá do standardního výstupu doprovodné informace o kompilaci, mezi nimiž najdeme i informaci o umístění vygenerovaného spustitelného souboru.
Ten poté můžeme přímo z příkazové řádky spustit např.:

$ /tmp/hphp_p6vSsP/program
  1. Vygenerujeme binární soubor stejně jako v předchozím případě, ale při jeho spuštění přidáme přepínač -m server, díky němuž je spuštěn webový server, který poslouchá na portu určeném přepínačem -p:
$ /tmp/hphp_p6vSsP/program -m server -p 8080

Pokud nyní otevřeme v internetovém prohlížeči http://localhost:8080/test.php, uvidíme výsledek našeho skriptu. Lze také použít přepínač -m daemon, který spustí server na pozadí. (Pozn.: Pro použití standardního HTTP portu 80 může být potřeba administrátorských oprávnění.)

  1. Lze použít také experimentální interpret HPHPi. Ten je určený především pro vývoj a testování. Soubory není třeba před spuštěním kompilovat. Hlavní použití je při ladení vlastního HipHop for PHP:

$ hphpi -f test.php

  1. Spuštěním serveru a interpretací souborů "on-the-fly":

$ hphpi -m server

Překladač disponuje mnoha dalšími přepínači. Např. pro projekty o více než jednom souboru existuje přepínač --input-list, díky němuž můžeme překladači nastavit soubor se seznamem všech .php souborů v projektu, které má zkompilovat.

Vývoj a uvedení[editovat | editovat zdroj]

Projekt byl vyvíjen dva roky a byl oficiálně představen 2. února 2010 na vývojářském blogu Facebooku (Facebook Developers: Developer Blog). Týž den se konala i konference pro tým vývojářů přenášená živě přes internet. V současné době má jako open-source projekt základnu na adrese http://github.com/facebook/hiphop-php. Zdrojové kódy HipHop for PHP jsou napsány na více než 300000 řádcích a obsahují přes 5000 unit testů. Podporovanými verzemi PHP je pouze 5.2, avšak verze 5.3 by měla být brzy uvedena. Projekt je licencován pod PHP Licence.

Pohnutky Facebooku k vývoji a nasazení[editovat | editovat zdroj]

Jedním z vytyčených cílů, které vedly ke vzniku HipHopu byla možnost psaní komplexní logiky aplikace přímo v PHP. Společnosti s velkými projekty na PHP postavenými obecně přepisují jejich základní funkcionalitu z čistého PHP do PHP rozšíření psaných v C nebo C++, aby obešly základní problémy interpretovaných jazyků jako je PHP, a sice vyšší nároky na CPU a dostupnou paměť. To však vede ke snižování počtu lidí, kteří jsou schopni pracovat se vším kódem aplikace. Díky tomuto si Facebook však svou schopnost rychlého vývoje zachovává.

Úspory na Facebook.com[editovat | editovat zdroj]

Na serverech Facebooku je měřitelná 50% úspora využití CPU při obsluze stejného počtu požadavků v porovnání s obyčejným PHP a Apache. 30% úspora nastává při obsluze dvojnásobného počtu požadavků.