迁移到新服务器后忘了装 opcache,PHP 每次请求都重新编译。首字节从 180ms 涨到 1.8 秒,日志里百度蜘蛛的请求开始出现 499 和超时,抓取频次掉了两档。
一开始怀疑是「FPM 的 pm.max_children 太小,请求直接排队」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。PHP 8.2 的 opcache 扩展没启用,enable 为 0。另一种情况是validate_timestamps 开着且间隔太短,频繁检查文件。
另外,页面里有同步外部请求,把响应时间进一步拉长。
上来先确认 opcache 是否生效
php -i | grep -E 'opcache.enable|opcache.memory_consumption'
然后打开并给足内存
opcache.enable=1
opcache.memory_consumption=256
opcache.validate_timestamps=60
接着重载 FPM 后复测首字节
curl -s -o /dev/null -w '%{time_starttransfer}\n' https://www.example.com/
剩下的就是观察蜘蛛超时是否消失
grep 'Baiduspider' access.log | awk '$9==499' | wc -l
这次没动代码,只在配置和运行环境上找原因。
恢复的判定其实很直接。首字节回落到 200ms 以内,日志里 499 归零,百度抓取频次一周内回到原来的档位。
opcache 是 PHP 站最划算的一步优化,迁移后先查这一项,比调页面缓存见效快。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
