WP Rocket + WooCommerce 首页缓存失效的四层排查过程

·0 次浏览
  • 作者
    帖子
  • weixiaoduo@weixiaoduo
    楼主

    问题

    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。

    经验总结

    1. WP Rocket 缓存失效要逐层排查:响应头 → mu-plugin/插件干预 → WP Rocket 自身配置 → 第三方插件的 DONOTCACHEPAGE 设置
    2. mandatory_cookies 是个陷阱:设计初衷是按 cookie 分流缓存,但如果首次访客没有该 cookie,就永远不会生成第一份缓存
    3. WC API Manager 默认禁用首页缓存:这个行为没有在插件设置界面暴露,只能通过 wp-config.php 常量覆盖
    4. 诊断页面缓存必须通过 HTTP 请求:WP-CLI 不加载 advanced-cache.php,无法复现缓存相关问题

Cyberforums · 原文 · Markdown

想回复或继续讨论?请到 Cyberforums 赛博论坛参与。

参与讨论 / 回复