【WP Rocket 故障复盘】预加载卡死循环:同一 URL 被疯狂访问数万次,最终靠清理数据库解决

社区话题 wordpress开发 【WP Rocket 故障复盘】预加载卡死循环:同一 URL 被疯狂访问数万次,最终靠清理数据库解决

  • 该话题为空。
正在查看 0 条回复
  • 作者
    帖子
    • #1044

      追光
      管理员

      ? 插件:WP Rocket
      ⚠️ 严重等级:高 —— 可导致服务器宕机、资源耗尽

      ?️ 问题现象

      今天上午,网站突然出现:

      服务器 CPU 飙升至 100%
      网站响应缓慢甚至超时
      查看访问日志发现:同一个 URL 被 WP Rocket 预加载功能反复访问了几千次、几万次
      没有轮换 URL,始终是同一个地址(比如 /product/xxx 或 /post/123)

      → 显然,这不是正常行为。WP Rocket 的 Sitemap Preload 本应按批次遍历所有 URL,而不是死循环卡在某一个。

      ip [06/Sep/2025:16:43:10 +0800] "GET /qualifier2 HTTP/1.1" 200 6499 "-" "wprocketbot"
      ip [06/Sep/2025:16:43:14 +0800] "GET /qualifier2 HTTP/1.1" 499 6499 "-" "wprocketbot"

      ? 初步排查

      1. 检查 WP Rocket 设置
      “Preload → Sitemap Preload” 功能开启
      频率设置异常为 5 分钟(默认应为 10 小时)
      但即使频率短,也不该卡在单个 URL —— 说明“分批处理”机制出错

      2. 检查 Cron 任务
      wp_rocket_sitemap_preload 任务确实在高频执行
      但每次执行都只处理同一个 URL,没有推进到下一批

      3. 怀疑缓存/状态记录异常
      WP Rocket 使用 wp_sitemeta 表(多站点)或 wp_options 表存储预加载批次状态
      关键键名:wp_rocket_sitemap_preload_batch_%

      ? 根本原因推测

      WP Rocket 在执行 Sitemap 预加载时:

      1. 读取 sitemap.xml 获取所有 URL
      2. 分批处理(如每批 20 个 URL)
      3. 记录当前批次状态到数据库(如 wp_rocket_sitemap_preload_batch_1, batch_2…)
      4. 下次 Cron 执行时,从断点继续

      ➡️ 本次故障推测:

      某个批次处理过程中发生错误(如页面 500、超时、插件冲突)
      导致“当前批次”状态未被清除或更新
      下次任务仍从同一批次开始 → 无限循环访问同一批 URL(甚至同一个 URL)
      加上 Cron 频率被错误设为 5 分钟 → 雪崩效应

      ?️ 解决方案

      ✅ 第一步:紧急止血 —— 清除预加载批次状态

      我直接登录数据库,执行了以下 SQL:

      select FROM 数据库名.wp_sitemeta
      WHERE meta_key LIKE 'wp_rocket_sitemap_preload_batch_%';
      DELETE FROM 数据库名.itao_sitemeta
      WHERE meta_key LIKE 'wp_rocket_sitemap_preload_batch_%';

      ? 注意:表名根据你的环境调整:
      单站点用 wp_options
      多站点用 wp_数字_sitemeta 或自定义前缀如 i_sitemeta

      执行后:

      WP Rocket 预加载任务“重置状态”
      下次执行时从头开始遍历 sitemap
      循环访问停止,服务器负载迅速恢复正常 ✅

      ? 经验总结

      | 项目 | 说明 |
      |||
      | ? 危险信号 | 同一 URL 被重复访问 + 高频 Cron = 服务器灾难 |
      | ? 根本原因 | 预加载批次状态卡死 + Cron 频率异常 |
      | ? 解决关键 | 清除 wp_rocket_sitemap_preload_batch_% 状态记录 |
      | ⚙️ 预防措施 | 设置合理 Cron 频率 + 限制每批 URL 数量 + 排除高负载页面 |
      | ? 建议频率 | 10 小时或 24 小时,除非内容极高频更新 |

      ? 附录:相关数据库键名(供排查使用)

      sql
      -多站点

      SELECT * FROM wp_sitemeta WHERE meta_key LIKE 'wp_rocket_sitemap_preload%';

      -单站点

      SELECT * FROM wp_options WHERE option_name LIKE 'wp_rocket_sitemap_preload%';

      常用键:

      wp_rocket_sitemap_preload_batch_1
      wp_rocket_sitemap_preload_batch_cursor
      wp_rocket_sitemap_preload_last_time

正在查看 0 条回复
  • 在下方一键注册,登录后就可以回复啦。