PHP OPcache — konfiguracja i optymalizacja
Opublikowano: 8 kwietnia 2026 · Kategoria: PHP / Serwer
OPcache to wbudowany mechanizm cache'owania kodu PHP w postaci skompilowanej (opcode). Eliminuje potrzebę parsowania plików PHP przy każdym żądaniu — WordPress z OPcache działa 2-5x szybciej niż bez cache'u. Ten artykuł opisuje konfigurację OPcache na VPS i hostingu współdzielonym.
Podstawowa konfiguracja php.ini
[opcache] ; Włącz OPcache opcache.enable=1 opcache.enable_cli=0 ; Pamięć na skompilowany kod (MB) opcache.memory_consumption=128 ; Pamięć na interned strings (MB) opcache.interned_strings_buffer=16 ; Maks. liczba plików w cache opcache.max_accelerated_files=10000 ; Jak często sprawdzać zmiany plików (sekundy, 0 = nigdy) ; Na produkcji: 0 (ręczne invalidation po deploy) ; Na dev: 2 (automatyczne odświeżanie) opcache.revalidate_freq=0 ; Zapisz skompilowany kod na dysk (trwałość po restarcie PHP) opcache.file_cache=/tmp/php-opcache ; Wyłącz timestampy na produkcji (szybsze, wymaga ręcznego clear) opcache.validate_timestamps=0
Optymalne ustawienia dla WordPress
; WordPress + WooCommerce (typowy serwer) opcache.memory_consumption=256 opcache.interned_strings_buffer=32 opcache.max_accelerated_files=20000 opcache.revalidate_freq=0 opcache.validate_timestamps=0 opcache.save_comments=1 ; wymagane przez DocBlock annotations opcache.fast_shutdown=1 ; Wielostronicowy serwer (wiele WP instalacji) opcache.memory_consumption=512 opcache.max_accelerated_files=50000
Weryfikacja i monitoring
<?php // opcache-status.php — usuń po użyciu! $status = opcache_get_status(); echo "Aktywny: " . ($status['opcache_enabled'] ? 'TAK' : 'NIE') . "\n"; echo "Hit rate: " . round($status['opcache_statistics']['opcache_hit_rate'], 2) . "%\n"; echo "Pliki w cache: " . $status['opcache_statistics']['num_cached_scripts'] . "\n"; echo "Pamięć użyta: " . round($status['memory_usage']['used_memory'] / 1024 / 1024, 2) . " MB\n"; echo "Pamięć wolna: " . round($status['memory_usage']['free_memory'] / 1024 / 1024, 2) . " MB\n"; echo "Hits: " . $status['opcache_statistics']['hits'] . "\n"; echo "Misses: " . $status['opcache_statistics']['misses'] . "\n";
Docelowe wartości: hit_rate > 90%, pamięć użyta < 80% przydzielonej.
Jeśli hit_rate spada — zwiększ max_accelerated_files.
Czyszczenie OPcache po deploymencie
# Metoda 1: WP-CLI (jeśli CLI i FPM w tym samym procesie)
wp eval "opcache_reset();" --allow-root
# Metoda 2: HTTP endpoint (bezpieczniejszy na serwerach z FPM)
# Utwórz: /var/www/html/clear-opcache.php
<?php
if ($_SERVER['REMOTE_ADDR'] === '127.0.0.1') {
opcache_reset();
echo "OPcache wyczyszczony";
}
# Wywołaj:
curl http://localhost/clear-opcache.php
# Usuń plik po użyciu!
# Metoda 3: Przez deploy script
php -r "opcache_reset();" # działa tylko gdy PHP CLI i FPM to ten sam proces
# Metoda 4: Restart PHP-FPM (pewna, ale reload serwisu)
systemctl reload php8.3-fpm OPcache na hostingu współdzielonym
# Ustawienia przez .user.ini (umieść w katalogu domeny) # Plik: /home/user/domains/twojadomena.pl/public_html/.user.ini opcache.revalidate_freq=60 opcache.memory_consumption=128 # Lub przez .htaccess (Apache + mod_php) # php_value opcache.revalidate_freq 60 # Weryfikacja (utwórz phpinfo.php): <?php phpinfo(); # Szukaj: "opcache" w sekcji Loaded Modules # Usuń plik po weryfikacji!
Porównanie konfiguracji: dev vs produkcja
| Dyrektywa | Dev | Produkcja | Uwagi |
|---|---|---|---|
| validate_timestamps | 1 | 0 | Na prod: ręczne invalidation |
| revalidate_freq | 2 | 0 | Sek. między sprawdzeniami |
| memory_consumption | 64 | 128-256 | MB pamięci RAM |
| max_accelerated_files | 4000 | 10000-50000 | Maks. plików w cache |
| enable_cli | 0 | 0 | CLI i FPM to osobne procesy |