我开始使用PHP 5.6的内置PHP OPcache,现在面临一个问题。 我将其设置为使用高达1 GB的RAM,这对于我的网站来说已经足够了,但是它永远无法使用全部1 GB的RAM。 caching被清除了很多次,然后才能分配这个限制,就像你在这张munin图中看到的那样:
所以每隔几天它就从caching中删除所有文件,并重新开始caching它们。
首先,我认为问题是variablesopcache.max_wasted_percentage但它不关心我设置它的值。 我的configuration如下:
; configuration for php ZendOpcache module ; priority=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
我正在使用nginx和FastCGI的Debian Jessie环境。
我想达到caching只有在内存消耗达到1 GB时才被清除。 我已经尝试了这样一个非常小的configuration:
; configuration for php ZendOpcache module ; priority=05 zend_extension=opcache.so opcache.enable = 1 opcache.enable_cli = 1 opcache.memory_consumption = 1024
即使如此,问题仍然存在。
如果需要FPMconfiguration:
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
希望我能在这里find任何已经遇到这个问题并能解决问题的人。 所以我的最后一个问题是:如何configurationOpCache,使其在可用内存已满时被清除?
OPcache转储整个caching,并在遇到任何configuration的限制时重新开始。 这种行为有点烦人,但这是我们现在所坚持的。
由于你没有达到内存限制,我猜测你正在达到一个你没有收集指标的限制。
特别是,您不收集使用中的caching键(文件)数量的度量标准。 我怀疑你已经达到了你configuration的65407的限制,应该提高它。
无论你是否达到这个极限,你都应该开始收集这些数据。
我现在可以validation我的情况是什么问题:
我使用一个软件,它可以删除自己的caching,并使用一个软件包系统,在那里你可以安装新的软件包。
每当我安装一个新的软件包或清除caching,软件运行一个opcache_reset()而不是只使用opcache_invalidate()因为它知道哪些文件即将被改变…