OPcache je vgrajen predpomnilnik bajtne kode PHP – največja razlika v zmogljivosti, ki jo lahko dobite v aplikaciji PHP, brezplačno in brez ene same spremembe kode. Ta vadnica prikazuje, kako ga dobro konfigurirati v produkciji, vključno s prednalaganjem in JIT za PHP 8.x.
1. Kaj OPcache dejansko počne
Brez OPcacheja PHP pri vsaki zahtevi razčleni datoteke PHP in jih prevede v bajtno kodo. OPcache to bajtno kodo shrani v RAM-u in jo ponovno uporabi, dokler se datoteke ne spremenijo. Rezultat: 2–5-krat hitrejši odziv, manj procesorja, manj V/I.
2. Preverite, ali je sploh vklopljen
Ustvari datoteko info.php :
<?php phpinfo(); Poiščite razdelek »Zend OPcache«. Če ga tam ni, namestite razširitev. V cPanelu: Programska oprema → Izberite različico PHP → Razširitve → označite opcache .
Ali prek CLI: php -m || grep -i opcache .
3. Priporočena konfiguracija za produkcijo
Uredite ustrezno datoteko php.ini ali 99-opcache.ini :
[opcache] opcache.enable = 1 opcache.enable_cli = 0 ; veličina keša — veći projekti trebaju više opcache.memory_consumption = 256 ; MB opcache.interned_strings_buffer = 16 ; MB ; koliko PHP fileova može keširati opcache.max_accelerated_files = 20000 ; koliko često provjerava promjene — produkcija 0, staging 2 opcache.validate_timestamps = 0 opcache.revalidate_freq = 0 ; optimizacije opcache.save_comments = 1 ; Craft/Laravel traže komentare opcache.fast_shutdown = 1 opcache.enable_file_override = 0 ; JIT (PHP 8.0+) — za CPU-heavy kod opcache.jit = 1255 opcache.jit_buffer_size = 128M ; za CLI workere (Laravel queue, artisan) opcache.enable_cli = 1 ; ako koristite long-running workereKaj to pomeni?[opcache] opcache.enable = 1 opcache.enable_cli = 0 ; veličina keša — veći projekti trebaju više opcache.memory_consumption = 256 ; MB opcache.interned_strings_buffer = 16 ; MB ; koliko PHP fileova može keširati opcache.max_accelerated_files = 20000 ; koliko često provjerava promjene — produkcija 0, staging 2 opcache.validate_timestamps = 0 opcache.revalidate_freq = 0 ; optimizacije opcache.save_comments = 1 ; Craft/Laravel traže komentare opcache.fast_shutdown = 1 opcache.enable_file_override = 0 ; JIT (PHP 8.0+) — za CPU-heavy kod opcache.jit = 1255 opcache.jit_buffer_size = 128M ; za CLI workere (Laravel queue, artisan) opcache.enable_cli = 1 ; ako koristite long-running workere
validate_timestamps = 0
OPcache ne preverja, ali so se datoteke na disku spremenile. Po namestitvi morate ročno ponastaviti predpomnilnik :
# preko CLI php -r 'opcache_reset();' # ili kroz web skriptu (obrisati nakon upotrebe!) <?php opcache_reset(); ?> # ili restart PHP-FPM systemctl restart php-fpmV skriptu za uvajanje (Capistrano, Deployer, GitHub Actions) dodajte korak, ki znova zažene FPM ali klice.# preko CLI php -r 'opcache_reset();' # ili kroz web skriptu (obrisati nakon upotrebe!) <?php opcache_reset(); ?> # ili restart PHP-FPM systemctl restart php-fpm
opcache_reset() .
Če želite samodejno ponovno nalaganje po namestitvi brez ponovnega zagona
Nastavite validate_timestamps = 1 in revalidate_freq = 60 OPcache bo preverjal časovni žig vsakih 60 sekund in ponovno naložil spremenjene datoteke. Nekoliko počasneje kot ročna ponastavitev, vendar veliko preprosteje.
4. Predhodno nalaganje (PHP 7.4+)
Preload naloži PHP datoteke v pomnilnik ob zagonu FPM – na voljo so vsem zahtevam brez ponovnega razčlenjevanja. Dela čudeže za kodo ogrodja (Laravel, Symfony).
; u php.ini opcache.preload = /var/www/preload.php opcache.preload_user = www-data Primer /var/www/preload.php (Laravel):
<?php $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('/var/www/app/vendor/laravel/framework/src') ); foreach ($files as $file) { if ($file->isFile() && substr($file->getFilename(), -4) === '.php') { opcache_compile_file($file->getRealPath()); } }Po vsaki uvedbi je treba FPM znova zagnati, da se prednalaganje naloži nova različica.<?php $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('/var/www/app/vendor/laravel/framework/src') ); foreach ($files as $file) { if ($file->isFile() && substr($file->getFilename(), -4) === '.php') { opcache_compile_file($file->getRealPath()); } }
5. JIT (PHP 8.0+)
Prevajalnik Just-In-Time – prevaja vročo kodo v izvorno strojno kodo. Uporabno za:
- Matematične / procesorsko zahtevne operacije.
- Dolgoročni delavci.
- Obdelava slik, kriptografija, prevajanje.
Manj uporabno za klasične spletne zahteve, kjer se >80 % časa porabi v bazi podatkov in V/I. Nastavitve opcache.jit = tracing in opcache.jit_buffer_size = 128M so dober začetek.
Če po aktivaciji JIT-a opazite segfaulte ali nenavadne napake, ga izklopite ( opcache.jit = off ) – še vedno obstajajo primeri regresij.
6. Spremljanje predpomnilnika OPcache
Koristne metrike, ki so na voljo prek opcache_get_status() :
<?php print_r(opcache_get_status(false));Kaj gledati:
-
memory_usage.used_memoryv primerjavi zfree_memory— če je free pod 10 %, povečajmemory_consumption. -
opcache_statistics.opcache_hit_rate— cilj >99 %. -
opcache_statistics.num_cached_scripts— če je blizumax_accelerated_files, povečajte omejitev. -
opcache_statistics.oom_restarts— >0 pomeni, da je predpomnilnik poln in se je znova zagnal. Povečajte pomnilnik.
Vizualna orodja: opcache-gui (github.com/amnuts/opcache-gui) ali opcache-status .
7. Tipične napake in simptomi
"Spremembe se po uvedbi ne prikažejo"
validate_timestamps = 0 in v skriptu za uvajanje ni ponastavitve. Dodaj.
"Naključnih 500 napak po uvedbi"
OPcache hrani staro bajtno kodo skupaj z novimi datotekami. Po namestitvi vedno znova zaženite FPM ali opcache_reset() , nikoli delno.
Status »Ponovni zagon OOM«
Predpomnilnik poln, OPcache izvaja popolno brisanje. Povečaj memory_consumption .
"Prednalaganje ni uspelo: ni bilo mogoče naložiti ..."
Skript za prednalaganje vsebuje napake ali se sklicuje na neobstoječe datoteke. Ročno preizkusite php preload.php .
8. Kontrolni seznam proizvodnje
- OPcache omogočen in dodeljenih vsaj 256 MB.
-
validate_timestamps = 0s ponastavitvijo v cevovodu uvajanja. -
save_comments = 1(zahtevano za Craft, Laravel, večino sodobnih PHP-jev). - Spremljanje metrik v dnevnem pregledu (stopnja zadetkov, prosti pomnilnik).
- Predhodno nalaganje omogočeno za datoteke ogrodja.
- JIT pri
tracings 128M medpomnilnikom za poti vroče kode (ali izklopljen, če pride do težav).
Dobro nastavljen OPcache pogosto prinese večji skok v zmogljivosti kot nadgradnja strojne opreme. Če ni konfiguriran v vašem projektu ali sumite, da ni optimalno nastavljen – se obrnite na nas, opravili bomo revizijo.