Ukratko: PHP JIT (just-in-time kompilator) često izvršavani PHP kod tijekom rada prevodi u strojni kod. Stigao je s PHP-om 8.0, dio je OPcachea i od PHP-a 8.4 prema zadanim je postavkama isključen. Računski zahtjevni zadaci time postaju znatno brži, a tipične web-stranice poput WordPressa jedva. Veći dobitak donose OPcache, aktualna verzija PHP-a i prikladno podešeno upravljanje procesima, a svaka aktualna verzija istodobno donosi potrebne sigurnosne ispravke.
Što je JIT kompilator u PHP-u?
PHP je interpretirani jezik: izvorni se tekst najprije prevodi u bytecode, takozvane opcodeove, a njih izvršava Zend Engine. JIT ide korak dalje. Promatra koji se dijelovi koda često izvršavaju i upravo ih prevodi u strojni kod za procesor. Od tada se izvršavaju bez zaobilaznog puta preko interpretera.
RFC o uvođenju opisuje JIT kao gotovo samostalan dio OPcachea. Stvoreni strojni kod nalazi se u dodatnom području zajedničke memorije OPcachea. S PHP-om 8.4 projekt je JIT iznova izgradio; prema stranici izdanja nova se implementacija temelji na IR frameworku, zajedničkom međuprikazu za generiranje koda. Kako motor radi ispod toga, objašnjava Zend Engine.
Najprije OPcache: prava osnova performansi
Bez OPcachea PHP svaku datoteku iznova prevodi pri svakom zahtjevu. OPcache bytecode čuva u zajedničkoj memoriji tako da ga svi workeri ponovno koriste. Za web-stranicu sa sustavom za upravljanje sadržajem to je daleko najvažnija poluga. Od PHP-a 8.5 OPcache je prema prihvaćenom RFC-u čvrsto ugrađen u PHP; poznate ini postavke i dalje upravljaju time je li predmemorija aktivna.
Važne zadane vrijednosti prema priručniku: opcache.enable=1, opcache.enable_cli=0, opcache.validate_timestamps=1 i opcache.revalidate_freq=2. Prema posljednjoj postavci OPcache najviše svake dvije sekunde provjerava jesu li se datoteke promijenile. Tko isključi validate_timestamps, mora nakon svakog deploymenta isprazniti predmemoriju ili ponovno pokrenuti PHP. Više u članku OPcache objašnjen.
Konfiguriranje PHP JIT-a: načini i postavke
JIT se kontrolira dvjema direktivama:
| Direktiva | Zadano od 8.4 | Zadano prije 8.4 | Značenje |
|---|---|---|---|
opcache.jit |
disable |
tracing |
način rada JIT-a |
opcache.jit_buffer_size |
64M |
0 |
memorija za stvoreni strojni kod, 0 isključuje JIT |
Za opcache.jit priručnik poznaje ove vrijednosti: disable (potpuno isključeno, tijekom izvođenja ne može se uključiti), off (isključeno, ali se tijekom izvođenja može uključiti), tracing odnosno on (preporučeno za većinu korisnika) i function. Uz to postoji četveroznamenkasti brojčani zapis za fina podešavanja.
; JIT ciljano uključiti, npr. za računski zahtjevne workere
opcache.enable=1
opcache.jit=tracing
opcache.jit_buffer_size=64M
Radi li JIT, pokazuje status OPcachea:
php -i | grep -i "opcache.jit" # postavke CLI-ja
php --ri "Zend OPcache" # konfiguracija ekstenzije OPcache
Imajte na umu da naredbeni redak može koristiti druge postavke nego PHP-FPM. Za web-rad vrijedi izlaz phpinfo() u FPM kontekstu, idealno pozvan samo interno i nakon toga uklonjen.
Što JIT donosi u praksi?
Autori RFC-a mjerili su: sintetička skripta bench.php s JIT-om je radila više nego dvostruko brže. Kod stvarnih aplikacija dobitak je bio malen; WordPress je postigao 326 umjesto 315 zahtjeva u sekundi, a PHP parser radio je otprilike 1,3 puta brže. RFC otvoreno kaže da JIT ne ubrzava znatno stvarne aplikacije poput WordPressa.
Razlog je u profilu tipičnih web-aplikacija. Većinu vremena čekaju na bazu podataka, datotečni sustav ili vanjske usluge. Brži put procesora tu malo pomaže. Koristi, naprotiv, mogu imati obrada slika u PHP-u, matematički izračuni, parseri ili dugotrajni workeri.
Performanse bez JIT-a: učinkovitije poluge
Za web-stranice poduzeća i shopove isplati se ovaj redoslijed:
- Aktualna verzija PHP-a: nove verzije donose optimizacije i prije svega sigurnosne ispravke.
- Ispravno dimenzionirati OPcache: dovoljno memorije i mjesta za sve datoteke aplikacije.
- Prikladno podesiti PHP-FPM:
pm.max_childrenprilagoditi dostupnoj radnoj memoriji, umjesto da se slijepo povećava. - Provjeriti bazu podataka: pronaći spore upite, postaviti indekse.
- Predmemoriranje na razini aplikacije: predmemorija stranica ili objekata, gdje sustav to podržava.
- Mjeriti umjesto nagađati:
request_slowlog_timeoutu PHP-FPM-u za spore zahtjeve zapisuje backtrace u slowlog.
JIT, performanse i sigurnost
Performanse i sigurnost povezani su tješnje nego što se čini. Prvo: svaka dodatna komponenta dodatan je kod. RFC o uvođenju sâm navodi rizik pogrešaka u JIT-u, u generiranju koda i dodjeli registara, te teže traženje pogrešaka. Tko JIT ne treba mjerljivo, ostavlja ga na zadanom disable.
Drugo: OPcache i workeri drže kod u memoriji. Nakon sigurnosnog ažuriranja poput onog za PHP2Shell stari procesi sa starim kodom nastavljaju raditi dok se ponovno ne pokrenu. Samo pražnjenje predmemorije ne zamjenjuje to ponovno pokretanje jer ranjivosti CVE-2026-109618 i CVE-2026-109619 leže u samoj PHP binarnoj datoteci.
Treće: najbolji dobitak performansi, aktualna verzija, istodobno je i najvažnija zaštitna mjera. PHP 8.2 dosiže kraj podrške 31. 12. 2026.; tko sada prijeđe na 8.4 ili 8.5, dobiva oboje. Kako sustave trajno održavamo brzima i ojačanima, opisuje ojačavanje poslužitelja za PHP web-poslužitelje.
Kako PHP SOS konkretno pomaže?
- Analiza postojećeg stanja: Očitavamo postavke OPcachea, JIT-a i FPM-a i uspoređujemo ih s opterećenjem i radnom memorijom.
- Mjerenje uskih grla: Slowlogom i pokazateljima poslužitelja pronalazimo gdje se vrijeme stvarno gubi.
- Sigurna konfiguracija: JIT samo gdje dokazano pomaže; OPcache tako da deploymenti i ažuriranja uredno djeluju.
- Planirati ažuriranja: Promjene verzije s testom i dokumentiranim ponovnim pokretanjem, kako bi brzina i stanje zakrpa bili usklađeni.
Česta pitanja
Je li JIT u PHP-u prema zadanim postavkama aktivan?
Od PHP-a 8.4 više nije: zadana vrijednost opcache.jit je disable. Prije je bio postavljen tracing, ali je međuspremnik opcache.jit_buffer_size bio na 0, pa JIT također nije radio.
Ubrzava li JIT WordPress?
Jedva. Već u RFC-u o uvođenju autori pišu da JIT ne ubrzava znatno stvarne aplikacije poput WordPressa. Njihova izmjerena vrijednost porasla je s 315 na 326 zahtjeva u sekundi.
Treba li mi OPcache ako ne koristim JIT?
Da. OPcache sprema preveden bytecode u zajedničku memoriju i pri svakom zahtjevu štedi ponovno kompiliranje. To je za gotovo svaku PHP web-stranicu najvažnija poluga performansi. Od PHP-a 8.5 OPcache je čvrsto ugrađen u PHP.
Je li JIT sigurnosni rizik?
Više koda znači više mogućih pogrešaka. RFC o uvođenju sâm navodi rizik pogrešaka u JIT-u i teže traženje pogrešaka. Tko ga ne treba, neka ga ostavi isključenim; tko ga koristi, trebao bi osobito brzo instalirati ažuriranja.