必须同时开启并精细配置:opcache.enable=1、validate_timestamps=0、revalidate_freq=0、max_accelerated_files≥20000、memory_consumption≥128,且需配合thinkphp路由缓存启用(route_check_cache=true)、app_debug=false及入口文件预热,否则缓存命中率低或代码不生效。

OPcache 和路由缓存必须一起开,但不能只改 opcache.enable=1 或只跑一条 php think route:cache 就完事——两者配置错位、时机不对、环境没切对,反而会让页面“改了不生效”或“上线后 502 爆增”。
ThinkPHP 生产环境 OPcache 怎么配才不翻车
默认配置在 ThinkPHP 下基本等于没开:每 2 秒检查文件时间戳、内存只给 64MB、最多缓 4000 个文件,而一个 TP8 + vendor 的项目轻松超 15000 个 PHP 文件。不调就上线,缓存命中率常低于 30%。
-
opcache.validate_timestamps=0和opcache.revalidate_freq=0必须同时设 —— 单设一个没用,后者在前者为 0 时仍可能触发 stat 检查 -
opcache.max_accelerated_files至少设为20000,TP8 含注解路由+多模块时建议直接65536 -
opcache.memory_consumption不要卡在默认64,中等项目起步128,含大量插件或 Swoole 常驻进程的建议256 - CLI 环境也要开:确认
opcache.enable_cli=1,否则php think route:cache生成的缓存文件本身不会被 OPcache 加载
为什么 route:cache 生成了但没走缓存
常见现象是 runtime/route/route.php 存在,但请求时依然走动态解析。根本原因不是命令失败,而是运行时没“认出”这个缓存文件。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 必须确保
app_debug=false且未被.env中的APP_DEBUG=true覆盖(php think env:show可验证) -
config/app.php中要显式开启:'route_check_cache' => true,仅生成文件不启用等于白干 - 检查
runtime/目录权限:Web 进程用户(如 www-data)需有读取runtime/route/route.php的权限,否则会静默降级回动态加载 - 若用了多应用模式,确认
route.php生成路径是否匹配当前应用名(如runtime/route/admin/route.php),否则框架找不到
改完代码页面不更新?先分清是哪一层在拦
不是 OPcache 没清,也不是路由缓存失效,而是三层缓存叠在一起,你只清了一层。
- OPcache 层:执行
php -r "opcache_reset();"或systemctl reload php-fpm(注意不是 restart) - ThinkPHP 路由缓存层:删掉
runtime/route/整个目录,再重新php think route:cache - 浏览器 / CDN 层:加响应头
Cache-Control: no-cache,或用curl -I看X-Cache头确认是否被代理缓存
上线后安全清理 OPcache 的实操方式
别在控制器里裸写 opcache_reset(),高并发下它会锁住所有 FPM worker,造成雪崩式 502。
- 推荐用部署脚本统一触发:发布完成后执行
php -r "opcache_reset();",确保只清一次 - 更稳的做法是配合 Nginx FastCGI 缓存键隔离:在
fastcgi_cache_key中加入$upstream_http_x_opcache_version,让不同 OPcache 版本的响应走不同缓存槽位 - 如果用的是 Swoole 或 Worker 模式,禁用
opcache.validate_timestamps后必须靠进程重启来刷新字节码,此时清理逻辑要集成进 reload 流程
最易被忽略的一点:OPcache 预热。TP 入口文件每次动态加载,核心类如 think\App 默认不会进缓存。要在 public/index.php 开头手动加 opcache_compile_file() 预热关键路径,否则首屏 TTFB 依然很高。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










