现场是这样的。地址从八万涨到十二万,插件一次性生成全量,PHP 执行到三十秒被切断,浏览器打开返回 504,文件只剩半截。
真正麻烦的地方在于,几个原因的现象几乎一样。单次生成把所有地址读进内存,超过执行时间上限;生成过程没有游标,中断后无法从断点继续;索引文件和子文件同时重写,蜘蛛读到中间状态。
动手时先看 PHP 超时与内存上限
php -i | grep -E 'max_execution_time|memory_limit'
随后按 ID 区间分批生成
for ($i=0; $i<120000; $i+=10000) { build_sitemap($i, 10000); }
再往下用索引文件指向各分片
curl -s https://www.example.com/sitemap_index.xml | grep -c '<sitemap>'
等前面都确认过,再逐个访问分片确认可读
for f in 1 2 3 4 5 6; do curl -sI https://www.example.com/sitemap-$f.xml | head -1; done
这次没动代码,只在配置和运行环境上找原因。
别只看报错消失,验证要多做一步。索引文件列出全部十二个分片,每个分片单独访问返回 200 且条数正确,GSC 显示读取成功。
这里还有个坑。按 ID 切比按日期切稳定,日期分段在发布时间集中时会出现某一片为空。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
