J'ai commencé à utiliser le OPcache intégré à PHP 5.6 et je rencontre un problème maintenant. Je l'ai configuré pour utiliser jusqu'à 1 Go de RAM, ce qui est largement suffisant pour mes sites web, mais il n'atteint jamais cette limite. Le cache est effacé de nombreuses fois avant d'atteindre cette limite comme vous pouvez le voir sur ce graphique munin :
Ainsi, tous les quelques jours, il supprime tous les fichiers du cache et recommence à les mettre en cache.
Au début, j'ai pensé que le problème était lié à la variable opcache.max_wasted_percentage
mais peu importe la valeur que je lui donne, cela ne change rien. Ma configuration est la suivante :
; configuration pour le module php ZendOpcache
; priorité=05
zend_extension=opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 1024
opcache.interned_strings_buffer = 128
opcache.blacklist_filename = /etc/php5/opcache_blacklist.txt
opcache.max_accelerated_files = 65407
opcache.revalidate_freq = 5
opcache.fast_shutdown = 1
opcache.max_wasted_percentage = 50
opcache.enable_file_override = 1
Je l'utilise dans un environnement basé sur Debian Jessie avec nginx et FastCGI.
Je souhaite que le cache ne soit effacé que lorsque la consommation de mémoire a atteint 1 Go. J'ai déjà essayé une configuration très minimale ressemblant à ceci :
; configuration pour le module php ZendOpcache
; priorité=05
zend_extension=opcache.so
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 1024
Même dans ce cas, le problème persiste.
Si la configuration FPM est nécessaire :
user = www
group = www
listen = 127.0.0.1:9002
listen.owner = www
listen.group = www
listen.allowed_clients = 127.0.0.1
pm = ondemand
pm.max_children = 100
pm.process_idle_timeout = 5s;
php.ini :
[PHP]
engine = On
short_open_tag = Off
asp_tags = Off
precision = 14
y2k_compliance = On
output_buffering = 4096
zlib.output_compression = Off
implicit_flush = Off
unserialize_callback_func =
serialize_precision = 17
allow_call_time_pass_reference = Off
safe_mode = Off
safe_mode_gid = Off
safe_mode_include_dir =
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
disable_functions = escapeshellcmd, exec, ini_restore, passthru, popen, proc_nice, proc_open, shell_exec, show_source, system
disable_classes =
zend.enable_gc = On
expose_php = Off
max_execution_time = 120
max_input_time = 300
memory_limit = 512M
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
html_errors = Off
error_log = /var/log/nginx/php_error.log
variables_order = "GPCS"
request_order = "GP"
register_globals = Off
register_long_arrays = Off
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 2000M
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
doc_root =
user_dir =
enable_dl = Off
cgi.fix_pathinfo = 0
file_uploads = On
upload_max_filesize = 200M
max_file_uploads = 200
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
J'espère trouver ici quelqu'un qui a déjà rencontré ce problème et qui a pu le résoudre. Ma question finale est la suivante : Comment configurer l'OpCache pour qu'il ne soit effacé que lorsque la mémoire utilisable est pleine ?