我遇到了 Opcache 问题。它没有像我希望的那样工作。
这是我的 opcache 配置
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
由于我的设置opcache.validate_timestamps = 0
被设置为 false,据我所知,修改任何 php 文件都不会产生任何影响,直到我使用 php 函数发布它opcache_reset();
所以我做了一个小测试,并更改了我的 index.php 文件(通过终端)。我插入了一个方法 print_r(opcache_get_status());
结果如下:
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
)
)
我的问题是的结果print_r(opcache_get_status());
不应该可见,因为我的opcache.validate_timestamps
设置为 false 并且只有当我通过opcache_reset();
方法重新加载 opcache 文件时更改才会生效。
我是对的还是我遗漏了什么?如果您需要任何其他信息,请告诉我,我会提供。谢谢!
更新
我发现并非所有文件都缓存了...运行以下命令find . -type f -print | grep php | wc -l
报告有 6167 个 php 文件,那么为什么只有 64 个 num_cached_scripts
答案1
我找到了问题所在。仔细检查代码后,我发现opcache_reset();
每次请求后都会执行一次。删除该行代码后,缓存就可以正常工作了。