Stručne: PHP JIT (just-in-time kompilátor) prekladá často vykonávaný kód PHP za behu do strojového kódu. Prišiel s PHP 8.0, je súčasťou OPcache a od PHP 8.4 je štandardne vypnutý. Výpočtovo náročné úlohy sa tak výrazne zrýchlia, typické weby ako WordPress sotva. Väčší zisk prinášajú OPcache, aktuálna verzia PHP a vhodne nastavená správa procesov, a každá aktuálna verzia prináša zároveň potrebné bezpečnostné opravy.
Čo je kompilátor JIT v PHP?
PHP je interpretovaný jazyk: zdrojový text sa najprv preloží do bytecode, takzvaných opcódov, a tie vykonáva Zend Engine. JIT ide o krok ďalej. Sleduje, ktoré časti kódu bežia často, a práve tie preloží do strojového kódu pre procesor. Odvtedy bežia bez obchádzky cez interpreter.
RFC k zavedeniu opisuje JIT ako takmer samostatnú súčasť OPcache. Vygenerovaný strojový kód leží v dodatočnej oblasti zdieľanej pamäte OPcache. S PHP 8.4 projekt JIT prebudoval; podľa stránky vydania je nová implementácia založená na frameworku IR, spoločnej medzireprezentácii pre generovanie kódu. Ako funguje engine pod tým, vysvetľuje Zend Engine.
Najprv OPcache: skutočný základ výkonu
Bez OPcache PHP preloží každý súbor pri každej požiadavke odznova. OPcache uchováva bytecode v zdieľanej pamäti, takže ho všetci workeri znovu používajú. Pre web so systémom správy obsahu je to zďaleka najdôležitejšia páka. Od PHP 8.5 je OPcache podľa prijatého RFC pevne skompilovaná v PHP; známe nastavenia ini naďalej riadia, či je cache aktívna.
Dôležité štandardné hodnoty podľa príručky: opcache.enable=1, opcache.enable_cli=0, opcache.validate_timestamps=1 a opcache.revalidate_freq=2. Pri poslednom nastavení OPcache kontroluje najviac každé dve sekundy, či sa súbory zmenili. Kto validate_timestamps vypne, musí po každom nasadení vyprázdniť cache alebo reštartovať PHP. Viac v OPcache vysvetlená.
Konfigurácia PHP JIT: režimy a nastavenia
JIT sa riadi dvoma direktívami:
| Direktíva | Štandard od 8.4 | Štandard pred 8.4 | Význam |
|---|---|---|---|
opcache.jit |
disable |
tracing |
Režim JIT |
opcache.jit_buffer_size |
64M |
0 |
Pamäť pre vygenerovaný strojový kód, 0 vypína JIT |
Pre opcache.jit pozná príručka tieto hodnoty: disable (úplne vypnuté, za behu sa nedá zapnúť), off (vypnuté, ale za behu zapnuteľné), tracing, resp. on (odporúčané pre väčšinu používateľov) a function. Okrem toho existuje štvorciferný číselný zápis na jemné nastavenia.
; JIT zapnúť cielene, napr. pre výpočtovo náročné workery
opcache.enable=1
opcache.jit=tracing
opcache.jit_buffer_size=64M
To, či JIT beží, ukazuje stav OPcache:
php -i | grep -i "opcache.jit" # nastavenia CLI
php --ri "Zend OPcache" # konfigurácia rozšírenia OPcache
Majte na pamäti, že príkazový riadok môže používať iné nastavenia než PHP-FPM. Pre webovú prevádzku je rozhodujúci výstup phpinfo() v kontexte FPM, ideálne vyvolaný iba interne a potom opäť odstránený.
Čo JIT prináša v praxi?
Autori RFC merali: syntetický skript bench.php bežal s JIT viac než dvakrát rýchlejšie. Pri reálnych aplikáciách bol zisk malý; WordPress dosiahol 326 namiesto 315 požiadaviek za sekundu, parser PHP bežal približne 1,3-krát rýchlejšie. RFC otvorene hovorí, že JIT reálne aplikácie ako WordPress výrazne nezrýchľuje.
Dôvod je v profile typických webových aplikácií. Väčšinu času čakajú na databázu, súborový systém alebo externé služby. Rýchlejšia cesta procesora tam pomáha málo. Profitovať naopak môže spracovanie obrazu v PHP, matematické výpočty, parsery alebo dlho bežiace workery.
Výkon bez JIT: účinnejšie páky
Pre firemné weby a obchody sa oplatí toto poradie:
- Aktuálna verzia PHP: Nové verzie prinášajú optimalizácie a predovšetkým bezpečnostné opravy.
- Správne dimenzovať OPcache: dostatok pamäte a miesta pre všetky súbory aplikácie.
- Vhodne nastaviť PHP-FPM:
pm.max_childrenprispôsobiť dostupnej operačnej pamäti, namiesto slepého zvyšovania. - Skontrolovať databázu: nájsť pomalé dotazy, nastaviť indexy.
- Caching na úrovni aplikácie: cache stránok alebo objektov, kde to systém podporuje.
- Merať namiesto hádať:
request_slowlog_timeoutv PHP-FPM zapisuje pri pomalých požiadavkách backtrace do slowlogu.
JIT, výkon a bezpečnosť
Výkon a bezpečnosť spolu súvisia tesnejšie, než sa zdá. Po prvé: každá ďalšia súčasť je ďalší kód. RFC k zavedeniu samo uvádza riziko chýb v JIT, pri generovaní kódu a prideľovaní registrov, ako aj ťažšie hľadanie chýb. Kto JIT meraním nepotrebuje, nechá ho na štandardnom disable.
Po druhé: OPcache a workery držia kód v pamäti. Po bezpečnostnej aktualizácii, ako pri PHP2Shell, bežia staré procesy so starým kódom ďalej, kým sa nereštartujú. Vyprázdnenie cache samotné tento reštart nenahrádza, pretože zraniteľnosti CVE-2026-109618 a CVE-2026-109619 sídlia priamo v binárke PHP.
Po tretie: najlepší zisk výkonu, aktuálna verzia, je zároveň najdôležitejším ochranným opatrením. PHP 8.2 dosiahne 31. 12. 2026 koniec podpory; kto teraz prejde na 8.4 alebo 8.5, získa oboje. Ako udržiavame systémy trvalo rýchle a zabezpečené, opisuje Zabezpečenie servera pre webové servery PHP.
Ako PHP SOS konkrétne pomáha?
- Analýza súčasného stavu: Čítame nastavenia OPcache, JIT a FPM a porovnávame ich so záťažou a operačnou pamäťou.
- Meranie úzkych miest: Pomocou slowlogu a ukazovateľov servera zisťujeme, kde sa čas skutočne stráca.
- Bezpečná konfigurácia: JIT len tam, kde preukázateľne pomáha; OPcache tak, aby nasadenia a aktualizácie čisto zabrali.
- Plánovanie aktualizácií: Zmeny verzií s testom a zdokumentovaným reštartom, aby sedelo tempo aj stav záplat.
Časté otázky
Je JIT v PHP štandardne aktívny?
Od PHP 8.4 už nie: štandardná hodnota opcache.jit je disable. Predtým bol prednastavený tracing, no vyrovnávacia pamäť opcache.jit_buffer_size bola nastavená na 0, takže JIT tiež nebežal.
Zrýchli JIT WordPress?
Sotva. Už v RFC k zavedeniu autori píšu, že JIT reálne aplikácie ako WordPress výrazne nezrýchľuje. Ich nameraná hodnota stúpla z 315 na 326 požiadaviek za sekundu.
Potrebujem OPcache, ak JIT nepoužívam?
Áno. OPcache ukladá preložený bytecode do zdieľanej pamäte a pri každej požiadavke šetrí opakované kompilovanie. Pre takmer každý web v PHP je to najdôležitejšia páka výkonu. Od PHP 8.5 je OPcache pevne zabudovaná v PHP.
Je JIT bezpečnostné riziko?
Viac kódu znamená viac možných chýb. RFC k zavedeniu samo uvádza riziko chýb v JIT a ťažšie hľadanie chýb. Kto ho nepotrebuje, nechá ho vypnutý; kto ho používa, mal by aktualizácie nasadzovať obzvlášť rýchlo.