
Ich habe ein Problem mit Opcache. Es funktioniert nicht so, wie ich es mir wünsche.
Dies ist meine Opcache-Konfiguration
cat /etc/php/7.1/apache2/php.ini | grep opcache
[opcache]
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 256
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 8882
;opcache.max_wasted_percentage=5
;opcache.use_cwd=1
opcache.validate_timestamps = 0
opcache.revalidate_freq = 0
;opcache.revalidate_path=0
;opcache.save_comments=1
opcache.fast_shutdown = 1
;opcache.enable_file_override=0
;opcache.optimization_level=0xffffffff
;opcache.inherited_hack=1
;opcache.dups_fix=0
;opcache.blacklist_filename=
;opcache.max_file_size=0
;opcache.consistency_checks=0
;opcache.force_restart_timeout=180
;opcache.error_log=
;opcache.log_verbosity_level=1
;opcache.preferred_memory_model=
;opcache.protect_memory=0
;opcache.restrict_api=
;opcache.mmap_base=
;opcache.file_cache=
;opcache.file_cache_only=0
;opcache.file_cache_consistency_checks=1
; Implies opcache.file_cache_only=1 for a certain process that failed to
;opcache.file_cache_fallback=1
;opcache.huge_code_pages=1
;opcache.validate_permission=0
;opcache.validate_root=0
Da meine Einstellung opcache.validate_timestamps = 0
auf „false“ gesetzt ist, sollte das Ändern einer PHP-Datei meines Wissens nach keine Auswirkungen haben, bis ich sie mit der PHP-Funktion freigebeopcache_reset();
Also habe ich einen kleinen Test gemacht und meine Datei index.php geändert (über das Terminal). Ich habe eine Methode print_r(opcache_get_status()); eingefügt.
Dies ist das Ergebnis:
array (
[opcache_enabled] => 1
[cache_full] =>
[restart_pending] => 1
[restart_in_progress] =>
[memory_usage] => Array
(
[used_memory] => 37994008
[free_memory] => 230441448
[wasted_memory] => 0
[current_wasted_percentage] => 0
)
[interned_strings_usage] => Array
(
[buffer_size] => 16777216
[used_memory] => 504816
[free_memory] => 16272400
[number_of_strings] => 11672
)
[opcache_statistics] => Array
(
[num_cached_scripts] => 64
[num_cached_keys] => 111
[max_cached_keys] => 16229
[hits] => 0
[start_time] => 1513234045
[last_restart_time] => 1513263246
[oom_restarts] => 0
[hash_restarts] => 0
[manual_restarts] => 124
[misses] => 358
[blacklist_misses] => 0
[blacklist_miss_ratio] => 0
[opcache_hit_rate] => 0
)
)
Mein Problem besteht darin, dass die Ergebnisse print_r(opcache_get_status());
nicht sichtbar sein sollten, da mein Wert opcache.validate_timestamps
auf „false“ gesetzt ist und die Änderungen erst wirksam werden sollten, wenn ich die Opcache-Dateien über opcache_reset();
die Methode neu lade.
Habe ich Recht oder übersehe ich etwas? Wenn Sie weitere Informationen benötigen, lassen Sie es mich bitte wissen und ich werde sie bereitstellen. Vielen Dank!
AKTUALISIEREN
Ich habe festgestellt, dass nicht alle Dateien zwischengespeichert werden... Wenn ich den folgenden Befehl ausführe, find . -type f -print | grep php | wc -l
wird angezeigt, dass 6167 PHP-Dateien vorhanden sind. Warum gibt es also nur 64 num_cached_scripts?
Antwort1
Ich habe herausgefunden, wo das Problem lag. Nachdem ich den Code durchgegangen war, stellte ich fest, dass nach jeder Anfrage jemand implementiert wurde opcache_reset();
. Nachdem ich diese Codezeile entfernt hatte, funktionierte der Cache.