WordPress 性能优化中,缓存是最重要的一环,也是最容易被误解的一环。很多人把“缓存”简单理解为“生成 HTML 静态文件”,但实际上缓存有多个层级,每一层解决不同的问题。理解这些层级的区别和配合方式,才能制定出真正有效的缓存策略。

第一层:页面静态缓存(Page Cache)

页面静态缓存的原理非常直接:用户第一次访问某个页面时,PHP 执行所有查询和逻辑,生成 HTML,然后把这个 HTML 保存成一个静态文件。后续访问同一个页面时,服务器直接返回那个静态文件,不再经过 PHP 和 MySQL。这能极大减少服务器负载,响应时间可以从几百毫秒降到几十毫秒甚至个位数毫秒。

常见的页面静态缓存插件包括 WP Rocket、W3 Total Cache、LiteSpeed Cache。如果是 Nginx 服务器,还可以配置 FastCGI Cache 实现无插件的页面缓存。页面缓存的缺点是动态内容(比如购物车、登录状态、评论表单)也会被缓存,所以需要合理的排除规则。

第二层:对象缓存(Object Cache)

对象缓存存储的是 PHP 对象或数组,而不是最终的 HTML。它的目标是减少重复的数据库查询。例如,get_option('siteurl') 在页面上可能被调用几十次,每次都会查询数据库。对象缓存会将第一次查询结果存储在内存中(比如 Redis 或 Memcached),后续调用直接返回。

WordPress 默认使用数据库作为对象缓存的后端(存储在 wp_options 表的 _transient 开头的记录中),但这只是降级方案。真正的对象缓存需要安装 Redis 或 Memcached,并用插件(如 Redis Object Cache)启用。启用后,你可以看到数据库查询数量显著下降。

对象缓存在多服务器环境下特别重要。如果你有多台 Web 服务器负载均衡,页面缓存可能需要在每台服务器上独立维护,但对象缓存可以集中在一台 Redis 服务器上,所有服务器共享。

第三层:数据库缓存(Database Cache)

数据库缓存不在 WordPress 层面控制,而是由 MySQL 自身提供的查询缓存功能。当同样的 SQL 语句再次执行时,MySQL 直接返回之前缓存的结果集。MySQL 8.0 已经移除了查询缓存功能,因为它在高并发写入场景下反而成了瓶颈。对于大多数 WordPress 站点,依靠页面缓存和对象缓存已经足够,不必过于纠结数据库缓存。

第四层:浏览器缓存(Browser Cache)

浏览器缓存是指通过 HTTP 响应头告诉浏览器:“这个文件在接下来的一小时内不会变,你可以存起来,下次直接用”。它适用于静态资源:图片、CSS、JS、字体文件等。配置方法是在 Nginx 或 Apache 中添加类似这样的规则:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

浏览器缓存不会影响 HTML 页面的更新,因为你通常不会让浏览器缓存 HTML(或者只缓存很短的时间)。

五层:CDN 缓存(Content Delivery Network)

CDN 本质上是分布在全球各地的反向代理缓存。它缓存的是你的静态资源,有些 CDN 也可以缓存 HTML 页面。CDN 不仅提供缓存,还能把流量分散到离用户最近的节点,降低延迟。配置 CDN 时,你需要确保缓存失效机制正常工作,比如更新 CSS 后能及时同步到所有边缘节点。

组合使用的最佳实践

对于普通的企业站或博客,推荐的缓存组合是:

  • 开启页面静态缓存,HTML 缓存时间设置为几小时到一天。

  • 使用 Redis 对象缓存,减少数据库查询。

  • 配置浏览器缓存,静态资源缓存 30 天。

  • 免费 CDN(如 Cloudflare)兜底。

对于电商网站,页面缓存的规则需要精细设计:登录用户、购物车页面、结账页面不应该被缓存。这时候可以通过插件设置排除规则,或者使用 ESI(Edge Side Includes)技术实现页面局部动态、整体静态。

调试缓存问题时,记住一个原则:缓存不是故障,缓存策略才是。如果你的修改没有在前端生效,要么是浏览器缓存,要么是 CDN 缓存,要么是页面静态缓存。先逐层清理,找到是哪一层卡住了,再针对性地解决。