Na kratko: PHP JIT (prevajalnik Just-in-Time) pogosto izvajano kodo PHP med izvajanjem prevede v strojno kodo. Prišel je s PHP 8.0, je del OPcache in je od PHP 8.4 privzeto izklopljen. Računsko zahtevne naloge so tako bistveno hitrejše, tipične spletne strani, kot je WordPress, pa komaj. Večji dobiček prinesejo OPcache, aktualna različica PHP in ustrezno nastavljeno upravljanje procesov, vsaka aktualna različica pa hkrati prinaša potrebne varnostne popravke.
Kaj je prevajalnik JIT v PHP?
PHP je interpretiran jezik: izvorna koda se najprej prevede v bajtno kodo, tako imenovane opcode, te pa izvede Zend Engine. JIT gre korak dlje. Opazuje, kateri deli kode se pogosto izvajajo, in prav te prevede v strojno kodo za procesor. Odtlej tečejo brez ovinka prek interpreterja.
RFC za uvedbo JIT opisuje kot skoraj samostojen del OPcache. Ustvarjena strojna koda leži v dodatnem območju skupnega pomnilnika OPcache. S PHP 8.4 je projekt JIT zgradil na novo; po strani izdaje nova implementacija temelji na ogrodju IR, skupni vmesni predstavitvi za ustvarjanje kode. Kako deluje stroj pod tem, razlaga Zend Engine.
Najprej OPcache: pravi temelj zmogljivosti
Brez OPcache PHP vsako datoteko pri vsaki zahtevi prevede znova. OPcache bajtno kodo hrani v skupnem pomnilniku, tako da jo vsi workerji ponovno uporabijo. Za spletno stran s sistemom za upravljanje vsebine je to daleč najpomembnejši vzvod. Od PHP 8.5 je OPcache po sprejetem RFC trdno vkompiliran v PHP; znane nastavitve ini še naprej nadzorujejo, ali je predpomnilnik aktiven.
Pomembne privzete vrednosti po priročniku: opcache.enable=1, opcache.enable_cli=0, opcache.validate_timestamps=1 in opcache.revalidate_freq=2. Z zadnjo nastavitvijo OPcache največ vsaki dve sekundi preveri, ali so se datoteke spremenile. Kdor izklopi validate_timestamps, mora po vsaki namestitvi izprazniti predpomnilnik ali znova zagnati PHP. Več o tem v OPcache razložen.
Konfiguracija PHP JIT: načini in nastavitve
JIT se nadzoruje z dvema direktivama:
| Direktiva | Privzeto od 8.4 | Privzeto pred 8.4 | Pomen |
|---|---|---|---|
opcache.jit |
disable |
tracing |
način JIT |
opcache.jit_buffer_size |
64M |
0 |
pomnilnik za ustvarjeno strojno kodo, 0 izklopi JIT |
Za opcache.jit priročnik pozna te vrednosti: disable (povsem izklopljeno, med izvajanjem ga ni mogoče vklopiti), off (izklopljeno, a med izvajanjem vklopljivo), tracing oziroma on (priporočeno za večino uporabnikov) in function. Poleg tega obstaja štirimestni številski zapis za fine nastavitve.
; JIT ciljno vklopiti, npr. za računsko zahtevne workerje
opcache.enable=1
opcache.jit=tracing
opcache.jit_buffer_size=64M
Ali JIT teče, pokaže stanje OPcache:
php -i | grep -i "opcache.jit" # nastavitve CLI
php --ri "Zend OPcache" # konfiguracija razširitve OPcache
Upoštevajte, da ukazna vrstica lahko uporablja druge nastavitve kot PHP-FPM. Za spletno delovanje šteje izpis phpinfo() v kontekstu FPM, idealno priklican samo interno in nato znova odstranjen.
Kaj JIT prinese v praksi?
Avtorji RFC so merili: sintetična skripta bench.php je z JIT tekla več kot dvakrat hitreje. Pri realnih aplikacijah je bil dobiček majhen; WordPress je dosegel 326 namesto 315 zahtev na sekundo, parser PHP je tekel približno 1,3-krat hitreje. RFC odkrito pravi, da JIT realnih aplikacij, kot je WordPress, ne pospeši bistveno.
Razlog je v profilu tipičnih spletnih aplikacij. Večino časa čakajo na podatkovno bazo, datotečni sistem ali zunanje storitve. Hitrejša pot procesorja tam malo pomaga. Pridobijo lahko nasprotno obdelava slik v PHP, matematični izračuni, parserji ali dolgo tekoči workerji.
Zmogljivost brez JIT: učinkovitejši vzvodi
Za podjetniške spletne strani in spletne trgovine se splača ta vrstni red:
- Aktualna različica PHP: nove različice prinašajo optimizacije in predvsem varnostne popravke.
- Pravilno dimenzionirati OPcache: dovolj pomnilnika in prostora za vse datoteke aplikacije.
- Ustrezno nastaviti PHP-FPM:
pm.max_childrenprilagoditi razpoložljivemu delovnemu pomnilniku, namesto da ga slepo povečujete. - Preveriti podatkovno bazo: poiskati počasne poizvedbe, nastaviti indekse.
- Predpomnjenje na ravni aplikacije: predpomnilnik strani ali objektov, kjer ga sistem podpira.
- Meriti namesto ugibati:
request_slowlog_timeoutv PHP-FPM za počasne zahteve zapiše sled klicev (backtrace) v slowlog.
JIT, zmogljivost in varnost
Zmogljivost in varnost sta tesneje povezani, kot se zdi. Prvič: vsaka dodatna komponenta je dodatna koda. RFC za uvedbo samo navaja tveganje napak v JIT, pri ustvarjanju kode in dodeljevanju registrov, ter težje iskanje napak. Kdor JIT merljivo ne potrebuje, ga pusti pri privzetem disable.
Drugič: OPcache in workerji držijo kodo v pomnilniku. Po varnostni posodobitvi, kot je tista za PHP2Shell, stari procesi s staro kodo tečejo naprej, dokler se ne zaženejo znova. Samo izpraznitev predpomnilnika tega ponovnega zagona ne nadomesti, saj ranljivosti CVE-2026-109618 in CVE-2026-109619 tičita v samem binarnem programu PHP.
Tretjič: največji dobiček zmogljivosti, aktualna različica, je hkrati najpomembnejši zaščitni ukrep. PHP 8.2 31. 12. 2026 doseže konec podpore; kdor zdaj preide na 8.4 ali 8.5, pridobi oboje. Kako sisteme trajno ohranjamo hitre in utrjene, opisuje utrjevanje strežnikov PHP.
Kako PHP SOS pomaga konkretno?
- Analiza stanja: preberemo nastavitve OPcache, JIT in FPM ter jih primerjamo z obremenitvijo in delovnim pomnilnikom.
- Merjenje ozkih grl: s slowlogom in kazalniki strežnika ugotovimo, kje se čas dejansko izgublja.
- Varna konfiguracija: JIT samo tam, kjer dokazano pomaga; OPcache tako, da nameščanje in posodobitve čisto delujejo.
- Načrtovanje posodobitev: menjave različic s testom in dokumentiranim ponovnim zagonom, da hitrost in stanje popravkov ustrezata.
Pogosta vprašanja
Ali je JIT v PHP privzeto aktiven?
Od PHP 8.4 ne več: privzeta vrednost opcache.jit je disable. Prej je bil privzet tracing, vendar je bil medpomnilnik opcache.jit_buffer_size nastavljen na 0, zato JIT prav tako ni tekel.
Ali JIT pospeši WordPress?
Komaj. Že v RFC za uvedbo avtorji pišejo, da JIT realnih aplikacij, kot je WordPress, ne pospeši bistveno. Njihova izmerjena vrednost se je dvignila s 315 na 326 zahtev na sekundo.
Ali potrebujem OPcache, če JIT ne uporabljam?
Da. OPcache prevedeno bajtno kodo shrani v skupni pomnilnik in ob vsaki zahtevi prihrani ponovno prevajanje. To je za skoraj vsako spletno stran PHP najpomembnejši vzvod zmogljivosti. Od PHP 8.5 je OPcache trdno vgrajen v PHP.
Ali je JIT varnostno tveganje?
Več kode pomeni več možnih napak. RFC za uvedbo samo navaja tveganje napak v JIT in težje iskanje napak. Kdor ga ne potrebuje, ga pusti izklopljenega; kdor ga uporablja, naj posodobitve nameščaj še posebej hitro.