opcache 需在 web 环境(非 cli)正确加载,配置需调大 max_accelerated_files 和 memory_consumption,生产环境必须关闭 validate_timestamps,并部署后手动重置缓存。

opcache.enable=1 这个配置只是起点,不是终点。ThinkPHP 项目开 OPcache 后没提速,甚至 phpinfo() 里压根不显示 OPcache 模块——说明它根本没加载进来,和框架本身无关。
确认 OPcache 是否真正加载(CLI 和 Web 环境要分开查)
ThinkPHP 运行在 Web SAPI(如 PHP-FPM)下,而你用 php -m 查的是 CLI 环境的模块列表,两者 php.ini 完全不同。只查 CLI 是无效的。
- 查 Web 环境实际加载的配置:在 ThinkPHP 项目里放一个
info.php,内容为<?php phpinfo(); ?>,访问它,找到 Loaded Configuration File 行,记下路径 - 查 CLI 当前配置(用于验证命令行工具):
php --ini,对比两个路径是否一致;不一致就必须分别改 - 在
phpinfo()页面搜索opcache,看到 Opcode Caching 显示 Enabled 才算成功加载 -
php -m | grep opcache有输出 ≠ Web 环境生效;php -i | grep "opcache.enable"能看到opcache.enable => On才算 CLI 生效
ThinkPHP 项目必须启用的 OPcache 关键参数
ThinkPHP 的自动加载、路由解析、模板编译等机制会产生大量小文件(比如 runtime/cache/ 下的缓存脚本、vendor/ 里的类文件),默认配置极易触发缓存淘汰或命中率暴跌。
-
opcache.max_accelerated_files=10000:ThinkPHP + Composer 依赖常超 5000 个文件,4000是底线,建议直接设10000 -
opcache.memory_consumption=128:低于64会导致频繁内存满、缓存被清空;大项目(含大量 vendor 或插件)建议256 -
opcache.validate_timestamps=0:生产环境必须关!否则每次请求都stat()所有已加载文件,ThinkPHP 的自动加载链会放大这个开销 -
opcache.revalidate_freq=0:配合validate_timestamps=0使用;设为0表示完全不检查时间戳(部署后需手动opcache_reset()) -
opcache.fast_shutdown=1:ThinkPHP 请求生命周期长,开启能减少 shutdown 阶段开销
部署后缓存不更新?别怪 OPcache,是部署方式错了
ThinkPHP 常用 rsync 或容器挂载方式上线,但 OPcache 默认依赖文件时间戳判断变更。如果新代码覆盖后 inode 不变、或 NFS/overlayfs 时间戳异常,OPcache 会继续执行旧 opcode。
- 若用
rsync --delete或解压覆盖部署:必须在部署脚本末尾加php -r 'opcache_reset();' - 若运行在只读文件系统(如某些 Serverless 环境):只能设
opcache.validate_timestamps=0,并靠重启 PHP-FPM 刷新缓存 - 避免用
touch更新时间戳来“骗” OPcache —— 它可能跳过部分文件,导致混合执行新旧逻辑 - ThinkPHP 的
Runtime目录(尤其是cache/和log/)不应被 OPcache 缓存,确保其路径不在opcache.file_cache范围内(默认不启用该选项)
验证 ThinkPHP 下 OPcache 是否真起作用
不能只看 phpinfo() 里有没有模块,得看它是否在服务真实请求。
- 访问一次 ThinkPHP 接口(如
/index.php?s=index/hello),再执行:php -r "print_r(opcache_get_status()['opcache_statistics']);" - 关注字段:
opcache_enabled => true、num_cached_scripts > 0、hits > 0(不是 0)、memory_usage['used_memory'] > 0 - 命中率 =
hits / (hits + misses),低于 80% 就说明缓存没跑起来,大概率是max_accelerated_files或memory_consumption太小 - ThinkPHP 启动阶段加载的
thinkphp/library/think/下所有类文件,应出现在opcache_get_status()['scripts']列表中
opcache.enable=1 就只是个摆设。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











