事件概述
8月20日,WordPress 7.1 正式发布。仅仅数小时后,大量使用 WP Rocket 的网站开始报致命错误(fatal error),部分站点的前端和后台同时宕机,用户无法自行修复。
这是一次由 WP Rocket 与 WordPress 7.1 兼容性引发的生产事故。WP Rocket 团队在事后公开承认:问题出在自己身上——未能及时处置已知风险。以下是完整的时间线与根因分析。
问题根因
WP Rocket 内置了一个与 Cloudflare 通信的小模块,无论你是否使用 Cloudflare,该模块始终处于激活状态。在其清理例程中,模块会对 WordPress 在两个特定钩子上生成的回调 ID 调用 PHP 的 substr() 函数。
此前的逻辑: WordPress 7.1 之前,回调 ID 始终为字符串类型,substr() 可正常处理。
WP 7.1 的变化: WordPress 7.1 调整了回调 ID 的生成方式,在特定条件下,ID 会以整数(integer)形式返回,而非字符串。
PHP 8 的严格类型检查: PHP 8 强化了类型约束,向 substr() 传入整数而非字符串时,不再静默忽略,而是直接抛出致命错误。
WordPress Core 维护者 Weston Ruter 于8月21日确认这是 WordPress 侧的破坏性变更(breaking change)。Core 贡献者已在 Trac 工单 #65919 提交了修复方案,预计随 WordPress 7.1.1 合入。
触发条件:四者缺一不可
该问题并非无条件触发,需要以下四个因素同时成立:
- WordPress 7.1
- PHP 8.x 环境
- 安装了 WP Rocket
- 另有其他插件以特定方式注册了回调
WP Rocket 团队排查了 WordPress.org 热度前 200 的插件、用户报告及公开 GitHub 活动后,确定了以下触发插件——需强调:这些插件本身没有任何错误,只是恰好满足了触发条件。
- Elementor Pro:用户拥有有效许可证且插件启用时
- Elementor Free:当
e_atomic_elements实验性设置开启时 - Redirection for Contact Form 7:插件启用后即触发
影响范围
基于确认触发插件的列表及用户更新模式,WP Rocket 估计:
- 约 27% 的 WP Rocket 网站处于风险之中
- 约 10% 的网站实际受到影响
由于 Elementor 在 WordPress 生态中极高的使用率,这一组合条件虽看似"特殊",实际命中了大量站点。
响应时间线
| 时间 | 事件 |
|---|---|
| 7月6日 | 首位用户在 GitHub 上提交工单,明确指出问题并提出了最终采用的修复方案。QA 当天排查,复现失败,无后续跟进。此后数周,零星客户通过工单遇到同样错误,均以回退 WordPress 版本解决,未关联到 GitHub 上的原始报告 |
| 7月15日 | WordPress 7.1 首个 Beta 发布。Bug 已存在于其中。WP Rocket 所有自动化与手动测试均通过,标记为”已测试、兼容 7.1″ |
| 8月19日 23:39(CEST) | WP 7.1 RC 版发布(发布派对现场),当晚工单开始涌入。此时非插件团队正常工作时间,但另一团队的开发者注意到升级并确认了根因 |
| 8月20日 00:35(CEST) | 手动临时修复就绪。因未经过常规 QA 验证,团队选择直接推送给已有工单的用户,并告知官方更新即将发布 |
| 8月20日 02:18(CEST) | WordPress 7.1 正式发布。开启自动更新的站点开始升级,此时起均面临触发风险 |
| 8月20日 04:08(CEST) | 支持团队发布文档文章,覆盖问题说明与临时方案 |
| 8月20日 07:30(CEST) | WP Rocket 插件团队上班,15 分钟内发布公告:产品内通知、社交媒体、状态页面更新、所有相关 GitHub 工单回复 |
| 8月20日 10:11(CEST) | WP Rocket 3.23.2.2 正式发布,通过自动化测试与定向手动验证,确认修复有效 |
| 8月21日 | 邮件通知所有活跃客户,说明事件经过,并建议在升级 WordPress 7.1 前先更新 WP Rocket |
测试流程为何未能拦截
这是用户最关心的问题。WP Rocket 公开了其完整测试流程,并承认了其中漏洞。
现行流程
PR 阶段: 每项变更由另一位开发者审查,包含手动测试,并确认自动化测试在多个 WordPress 与 PHP 版本上通过。这些测试在 GitHub 仓库中公开。
合并前: QA 工程师使用最新版 WordPress nightly build 验证变更,捕获潜在回归。
合并后: 开发版持续运行约 100 个端到端自动化测试,覆盖 NGINX 与 Apache 两种环境,测试版本包含最新版 WordPress 及 Beta/RC 版。测试范围包含以下第三方插件/主题的兼容性: Query Monitor、Imagify、Cloudflare、WPML、Divi、Avada、Astra、Flatsome、Storefront、Hello Elementor、Neve、Kadence、GeneratePress、Genesis Sample、OceanWP。

漏洞所在
测试列表并非基于"用户使用频率"构建,而是多年间随插件兼容性优化逐步扩充的——解决了一个插件的问题,就为其添加自动化测试以防回退。这是一个合理的渐进策略,但也留下了真实的盲区。
Elementor Pro 就不在这个列表中。 这直接导致其在 WordPress 7.1 环境下的行为未被覆盖。
事件回顾:WP Rocket 故障是如何发生的
WP Rocket 是一款主流 WordPress 缓存插件,此前因 Cloudflare 模块存在缺陷导致部分网站出现故障。团队在新版本发布前会先在内部以候选版本(RC)形式运行,进行额外的探索性测试,再在数天内逐步向用户推送,而非一次性全量发布——这样设计的初衷是尽早发现大规模发布可能暴露的问题,在影响全部用户之前完成热修复。
然而这一次,上述所有机制都未能拦住问题。
根本原因在于:故障只在使用了特定第三方插件/主题的站点上才会触发,而 WP Rocket 的自动化检查套件中并不包含这类第三方环境配置;近期各版本的手动测试计划也恰好没有覆盖到这些场景,导致问题一路漏到了生产环境。
做了什么改变
GitHub Issue 有人负责了 7 月 6 日的事故报告经过审阅后,因始终没有指定负责人,在初始复现失败后便退出了团队视野。WP Rocket 已建立明确责任制:每份报告都必须经过分类、标记、相关问题升级到产品侧,并在新评论出现时保持更新。
重建兼容性测试套件 原有的兼容性测试套件是历年增量积累的结果,并非基于用户实际使用环境的主动规划。团队正在重新构建这份清单,起点是 WP Rocket 最常用搭配的热门插件和主题列表,后续将依据第三方 popularity 数据以及日常兼容性工作持续扩充。WordPress 生态高度开放,无法承诺覆盖所有可能的配置组合,但这个清单会以"有意设计"而非"历史沿革"的方式持续生长。
即时修复:Cloudflare 模块按需加载 Cloudflare 模块此前会在所有站点上无条件运行,即便该站并未启用 Cloudflare 相关服务。修复方案是在模块入口处增加检测逻辑——仅在 Cloudflare 插件实际激活时才加载该代码路径,从根本上消除对不需要该功能的站点的干扰。
后续改进计划 上述改动落地后,团队还计划推进:加快内部升级到公开沟通的处理速度、清理不应加载的废弃代码路径、缩短从确认问题到发布热修复之间的验证周期。
影响与建议
这次故障消耗了真实的时间,也损耗了真实的信任,两者对团队都至关重要。WP Rocket 对此次宕机给用户带来的压力和不便深表歉意,也感谢每一位提交问题报告、通过变通方案维持服务、或帮助他人解决问题的用户——你们的行动让这次事件对其他人的影响比原本更短、更轻。
信任的重建靠的不是道歉,而是时间和行动。上述改进是 WP Rocket 尝试通过长期的实际行动重新赢得信任的起点。



