OPcache je ugrađeni PHP bytecode cache — najveća pojedinačna performansna razlika koju možete dobiti na PHP aplikaciji, besplatno, bez ijedne promjene u kodu. Ova uputa pokazuje kako ga dobro konfigurirati na produkciji, uključujući preloading i JIT za PHP 8.x.
1. Što OPcache zapravo radi
Bez OPcache-a PHP pri svakom zahtjevu parsira PHP fileove i prevodi ih u bytecode. OPcache taj bytecode drži u RAM-u i ponovno koristi dok god se fileovi ne promijene. Rezultat: 2-5× brži response, manji CPU, manji I/O.
2. Provjeri je li uopće uključen
Kreirajte info.php:
<?php phpinfo();
Potražite sekciju "Zend OPcache". Ako je nema, instalirajte ekstenziju. Na cPanel-u: Software → Select PHP Version → Extensions → označite opcache.
Ili preko CLI: php -m | grep -i opcache.
3. Preporučena konfiguracija za produkciju
Uredite odgovarajući php.ini ili 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 workere
Što znači validate_timestamps = 0
OPcache ne provjerava jesu li se fileovi na disku promijenili. Nakon deploya morate ručno resetirati cache:
# preko CLI
php -r 'opcache_reset();'
# ili kroz web skriptu (obrisati nakon upotrebe!)
<?php opcache_reset(); ?>
# ili restart PHP-FPM
systemctl restart php-fpm
U deploy skripti (Capistrano, Deployer, GitHub Actions) dodajte korak koji restarta FPM ili zove opcache_reset().
Ako želite auto-reload nakon deploy-a bez restart-a
Postavite validate_timestamps = 1 i revalidate_freq = 60. OPcache će svakih 60s provjeriti timestamp i reloadati promijenjene fileove. Malo sporiji nego manual reset, ali puno jednostavniji.
4. Preloading (PHP 7.4+)
Preload učitava PHP fileove u memoriju pri startu FPM-a — dostupni su svim zahtjevima bez ponovnog parsiranja. Radi čuda za framework code (Laravel, Symfony).
; u php.ini
opcache.preload = /var/www/preload.php
opcache.preload_user = www-data
Primjer /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());
}
}
Nakon svakog deploya treba restart FPM-a da preload učita novu verziju.
5. JIT (PHP 8.0+)
Just-In-Time kompajler — prevodi hot code u native strojni kod. Koristan za:
- Matematičke / CPU-heavy operacije.
- Long-running workere.
- Image processing, cryptography, compilation.
Manje korisno za klasične web requeste gdje je >80% vremena u bazi i I/O-u. Postavke opcache.jit = tracing i opcache.jit_buffer_size = 128M su dobar početak.
Ako nakon aktivacije JIT-a primijetite segfault-ove ili čudne greške, isključite ga (opcache.jit = off) — i dalje ima slučajeva regresija.
6. Monitoring OPcache-a
Korisne metrike dostupne preko opcache_get_status():
<?php print_r(opcache_get_status(false));
Što gledati:
memory_usage.used_memoryvsfree_memory— ako je free ispod 10%, povećajmemory_consumption.opcache_statistics.opcache_hit_rate— cilj >99%.opcache_statistics.num_cached_scripts— ako je blizumax_accelerated_files, povećaj limit.opcache_statistics.oom_restarts— >0 znači da je cache pun i restartao se. Povećaj memory.
Vizualni alati: opcache-gui (github.com/amnuts/opcache-gui) ili opcache-status.
7. Tipične greške i simptomi
"Changes don't appear after deploy"
validate_timestamps = 0 a nema reseta u deploy skripti. Dodajte.
"Random 500 errors after deploy"
OPcache drži stari bytecode u kombinaciji s novim fileovima. Uvijek restart FPM-a ili opcache_reset() nakon deploya, nikad parcijalno.
"OOM restart" u statusu
Cache pun, OPcache radi full flush. Povećaj memory_consumption.
"Preload failed: could not load..."
Preload skripta ima greške ili referira na nepostojeće fileove. Testirajte php preload.php ručno.
8. Kontrolna lista za produkciju
- OPcache uključen i barem 256MB allocated.
validate_timestamps = 0s reset-om u deploy pipelineu.save_comments = 1(obavezno za Craft, Laravel, većinu modernog PHP-a).- Monitoring metrika u dnevnom pregledu (hit rate, free memory).
- Preload uključen za framework fileove.
- JIT na
tracings 128M buffera za hot code paths (ili isključen ako ima problema).
Dobro podešen OPcache često donese veći performansni skok nego upgrade hardwarea. Ako na vašem projektu nije konfiguriran ili sumnjate da nije optimalno postavljen — javite se, napravimo audit.