sitemap 由 PHP 现场查询数据库生成,八万条 URL 要跑 9 秒,日志里 Googlebot 的请求经常在 5 秒左右断开,GSC 报读取失败。把超时调到 30 秒后,源站 CPU 直接被拖满。

一开始怀疑是「PHP-FPM 的 request_terminate_timeout 是 5 秒,进程被直接杀掉」,查了一圈,方向不对。

这类报错背后常见的原因有几处,逐个排除就行。每次请求都全量查库并拼接字符串,没有落静态文件。少数情况下是查询没走索引,八万行做了全表扫描。

不容易想到的是,输出没有分批 flush,蜘蛛等首字节的时间过长。

测单次生成耗时

curl -s -o /dev/null -w '%{time_total}\n' https://www.example.com/sitemap.xml

随后改成定时生成静态文件

php bin/build-sitemap.php --out=/data/www/sitemap.xml

再往下确认查询走了索引

EXPLAIN SELECT ID FROM wp_posts WHERE post_status='publish';

静态文件交给 Nginx 直接返回

location = /sitemap.xml { root /data/www; }

同事提醒我看一下最近一次发布,时间点确实对得上。

改完先别撤,确认这几项。sitemap 响应时间降到 100ms 以内,蜘蛛请求不再中断,GSC 读取状态恢复正常。

sitemap 是静态清单,没必要每次请求都现算,定时生成加缓存能同时省下源站和蜘蛛的时间。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189