opcache省去了php每次请求时的读文件、分词、语法解析和编译opcode四步,直接从共享内存加载已编译opcode执行;它不缓存页面内容,但显著提升动态页面性能。

OPcache到底省了哪几步?不是缓存页面,是跳过编译
PHP每次请求一个脚本,都要走一遍:读文件 → 分词(tokenize)→ 语法解析(parse)→ 编译成opcode → 执行。OPcache干的事,就是把第4步生成的opcode存进共享内存。下次再请求同一个文件,直接从内存加载opcode执行,前面四步全跳过——所以哪怕返回的是动态内容(比如用户昵称、实时订单),只要PHP代码没变,就能加速。
实测宝塔后台开启后,TTFB(首字节时间)常下降30%~60%,PHP-FPM进程CPU占用明显降低,尤其对WordPress、Laravel这类文件多、入口分散的项目效果更明显。
宝塔后台一键启用OPcache,但默认参数根本不够用
宝塔在【软件商店】→ PHP 8.4 → 【设置】→ 【安装扩展】里点“安装”opcache,再勾选【性能调整】里的开关,确实能快速启用。但问题在于:它预设的memory_consumption=128、max_accelerated_files=10000,对中大型站点远远不够,容易导致缓存频繁淘汰、命中率暴跌。
- 查你项目实际PHP文件数:
find /www/wwwroot/your-site -name "*.php" | wc -l,如果超15000,max_accelerated_files至少得设到20000 -
memory_consumption建议调到256(单位MB),小站可128,但别低于64 - 宝塔界面改完后,一定要点【重载配置】或重启PHP服务,否则参数不生效
生产环境千万别设validate_timestamps=0
这个坑踩的人最多:为了“极致性能”,把opcache.validate_timestamps=0,结果上线新代码后页面还是旧逻辑,甚至报Fatal error: Class 'XXX' not found——因为OPcache完全不检查文件是否更新,还在跑旧opcode。
立即学习“PHP免费学习笔记(深入)”;
正确做法是保持validate_timestamps=1,再配一个合理的revalidate_freq=60(每60秒检查一次)。这样既避免每次请求都读磁盘,又保证发布后1分钟内自动刷新缓存。如果用rsync或容器部署,也比盲目关掉安全得多。
验证不是看phpinfo()里有没有OPcache,而是看命中率
新建一个opcache-status.php,内容就一行:<?php print_r(opcache_get_status()); ?>。访问它,重点看两个值:
-
opcache_statistics['hits'] / (hits + misses)—— 命中率要稳定在85%以上才算健康 -
opcache_statistics['opcache_enabled']必须为true,且memory_usage['used_memory']不能长期为0 - 如果返回空数组或报错,大概率是
opcache.enable_cli=1被误开(CLI下应为0),或PHP-FPM根本没重启
配置调完不验证,等于没开;验证只看phpinfo()里写了“enabled”,等于白看。











