迁移到新服务器后忘了装 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 站最划算的一步优化,迁移后先查这一项,比调页面缓存见效快。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189