- 作者帖子
问题
WooCommerce 商城首页 TTFB 从正常的 0.2s 飙升到 2.3s,WP Rocket 页面缓存完全失效。nginx 层面没有缓存文件生成,每次请求都打到 PHP。
环境
- WordPress 6.9.1 多站点(子目录模式)
- WooCommerce 10.3.7
- WP Rocket 3.x + Object Cache Pro(Redis)
- PHP 8.3,nginx
排查过程:四层问题逐一剥离
第一层:Redis 崩溃
Redis maxmemory 设置为 6GB 但实际使用超限,导致 Object Cache Pro 频繁回落到数据库查询。
解决:调整 maxmemory 到 8GB,Object Cache Pro 设置 maxttl=86400 防止缓存无限增长。
第二层:mu-plugin 注入 no-cache 头
发现一个用于屏蔽统计脚本的 mu-plugin,在 wp_head 钩子中注入了
Cache-Control: no-cache响应头。WP Rocket 检测到该头后跳过缓存写入。解决:删除该 mu-plugin(功能已被其他方式替代)。
第三层:多币种插件的 mandatory cookie
WP Rocket 配置中存在 YITH 多币种插件设置的 mandatory cookie。逻辑是:只有携带该 cookie 的请求才会被缓存。但首次访客没有这个 cookie,所以永远不会生成缓存文件——形成死循环。
解决:清空 WP Rocket mandatory_cookies 配置。币种选择改为前端 JS 处理,不依赖服务端 cookie 分流。
第四层:WC API Manager 禁用首页缓存
前三层修复后,内页缓存恢复正常,但首页仍然不缓存。
追踪发现 WooCommerce API Manager 插件在
wc-am-smart-cache.php中有一段逻辑:当WC_AM_DISABLE_HOMEPAGE_CACHE常量为 true(默认值)且当前页面是首页时,设置DONOTCACHEPAGE常量为 true。WP Rocket 在can_process_buffer()中检测到该常量后放弃缓存。解决:在 wp-config.php 中添加:
define('WC_AM_DISABLE_HOMEPAGE_CACHE', false);结果
TTFB 从 2.3s 降到 0.18s(直接命中缓存)。含 WooCommerce geolocation_ajax 307 跳转的完整流程约 0.9s。
经验总结
- WP Rocket 缓存失效要逐层排查:响应头 → mu-plugin/插件干预 → WP Rocket 自身配置 → 第三方插件的 DONOTCACHEPAGE 设置
- mandatory_cookies 是个陷阱:设计初衷是按 cookie 分流缓存,但如果首次访客没有该 cookie,就永远不会生成第一份缓存
- WC API Manager 默认禁用首页缓存:这个行为没有在插件设置界面暴露,只能通过 wp-config.php 常量覆盖
- 诊断页面缓存必须通过 HTTP 请求:WP-CLI 不加载 advanced-cache.php,无法复现缓存相关问题
- 作者帖子
Cyberforums · 原文 · Markdown
想回复或继续讨论?请到 Cyberforums 赛博论坛参与。
参与讨论 / 回复