PHP每次执行脚本都要先把源码编译成字节码,这步是纯浪费——代码又没变,凭什么每个请求都重新编译一遍。OPcache把编译结果放进共享内存,第二次起直接拿来执行。这个扩展默认装了但常常没调好,等于揣着金饭碗要饭。
; php.ini 中调整
opcache.enable = 1
opcache.memory_consumption = 256 ; 共享内存256MB
opcache.interned_strings_buffer = 32 ; 驻留字符串池32MB
opcache.max_accelerated_files = 50000 ; 最大缓存文件数
opcache.validate_timestamps = 1 ; 生产可设0彻底关检查
opcache.revalidate_freq = 60 ; 60秒检查一次文件更新
max_accelerated_files按你项目文件数定,框架项目轻松上万文件,默认值4000根本不够用,不够时会发生缓存抖动——刚编译好的又被挤出去,性能忽高忽低。看一眼框架vendor目录文件数:find . -name "*.php" | wc -l,往上取整再加两成余量。
validate_timestamps设成0后OPcache不再检查文件改动,改了代码也不会生效,必须重启php-fpm或调用opcache_reset。听起来麻烦,但省掉了每次请求的stat系统调用,大流量站点这一个小开关就能带来可感知的提升。配套做法是发布脚本里自动加上重载动作。
验证两步:phpinfo里确认opcache.enable生效、Cache满没满;ab压测对比调优前后RPS。顺嘴提醒Windows下跑PHP的(不少ASP站长混跑),OPcache在Windows下同样可用,路径换成对应ini位置即可。调优前先压个基准线,不然你永远不知道这半小时值不值。
A5创业网 版权所有