ThinkPHP 5.1 框架虽然没有直接提供一条现成的 OPcache 预热命令,但通过组合配置几个关键步骤,完全可以实现类似的精准预热效果。其核心思路并非“自动预热”,而是“精准加载 + 稳定命中”——在服务启动初期,就让 OPcache 缓存住关键字节码,从而显著减少首屏延迟和高并发场景下的编译抖动。

确认 OPcache 已正确启用并适配 ThinkPHP 5.1 运行环境
先从配置说起。以下几个关键参数需要确认是否设置到位:
opcache.enable=1必须开启,同时opcache.enable_cli=1也要打开(因为后续需要借助 CLI 模式触发预热)。opcache.validate_timestamps=0和opcache.revalidate_freq=0必须同时设为 0,否则每次请求都会 stat 文件,预热效果会被抵消。opcache.memory_consumption建议设为 256 MB,opcache.max_accelerated_files至少设到 20000,避免缓存被频繁挤出。- 修改配置后,记得重启
php-fpm(不是 Nginx 或 Apache),确保所有 worker 进程都加载了新配置。
执行路由与配置缓存,为 OPcache 提供稳定入口
ThinkPHP 5.1 的 optimize:route 和 optimize:config 命令会生成 PHP 文件,比如 runtime/route.php 和 runtime/init.php。这些文件会被 OPcache 自动缓存——它们结构简单、执行路径固定,是理想的“预热锚点”。
- 运行
php think optimize:route→ 生成runtime/route.php - 运行
php think optimize:config→ 生成runtime/init.php - 确保
APP_DEBUG=false,否则这些缓存文件不会被加载
这两步操作完成后,框架启动时就不再动态解析路由和配置,大幅减少了需要编译的脚本数量,也让 OPcache 更容易覆盖主干逻辑。
用 CLI 主动触发关键脚本编译(模拟预热)
OPcache 不会主动预加载所有文件,但可以通过 opcache_compile_file() 或直接执行脚本来“强制入缓存”。对 ThinkPHP 5.1 来说,最有效的做法是加载入口与核心类:
创建一个预热脚本 warmup_opcache.php:
在部署后或服务启动时运行:
php warmup_opcache.php。需要特别注意的是,该脚本必须在opcache.enable_cli=1的环境下执行,且仅用于初始化阶段,不能在 Web 请求中反复调用。验证是否真正预热成功
- 查看命中率:
php -r "print_r(opcache_get_status()['opcache_statistics']['hits'] / (opcache_get_status()['opcache_statistics']['hits'] + opcache_get_status()['opcache_statistics']['misses']));" - 检查缓存条目数:
php -r "print_r(opcache_get_status()['scripts']);",确认route.php、init.php及核心类已列在其中。 - 观察
opcache_get_status()['memory_usage']['used_memory']是否在预热后明显上升,且保持稳定不回落。
最后提醒一下,这些步骤操作起来并不复杂,但容易忽略。配置到位、脚本写对、验证做全,才能让预热真正发挥效用。
