W3 Total Cache缓存层全面解析:页面缓存、对象缓存、数据库缓存与浏览器缓存配置指南 - 易服客工作室

📎 原文来源:W3 Total Cache缓存层全面解析:页面缓存、对象缓存、数据库缓存与浏览器缓存配置指南 - 易服客工作室

https://gplwp.eastfu.com/w3-total-cache-huan-cun-ceng-xiang-jie-ye-mian-dui-xiang-shu/

深入解析W3 Total Cache各缓存层及适用场景,适合追求性能调优的开发者。

  • 页面缓存:直接提供静态HTML,绕过PHP与数据库。
  • 对象缓存:缓存数据库查询结果,减少重复请求。
  • 数据库缓存:存储查询结果,加速动态内容。
  • 浏览器缓存:利用本地缓存静态资源,减少加载时间。
  • 谨慎开启所有缓存,可能引发兼容性问题。

关键术语:

  • 页面缓存:将动态页面生成为静态HTML文件,直接提供给访客。
  • 对象缓存:缓存数据库查询结果或PHP对象,避免重复计算。
  • 数据库缓存:将SQL查询结果暂存,加速后续相同请求。
  • 浏览器缓存:指示浏览器本地存储CSS、JS等静态资源。

一个拥有二十篇文章时运行如飞的网站,当文章数量达到两千篇、安装十几个插件,并且首页每次加载都要查询半个数据库时,就会变得步履蹒跚。这时,大多数站长开始寻找缓存插件,而W3 Total Cache是他们最先遇到的插件之一。这个插件不会对你隐藏任何东西:每一个缓存层都是一个独立的开关,这既是它的魅力所在,也是陷阱所在。本文将逐一介绍这些缓存层、背后的存储引擎、开发者API,以及如果你一次性全部开启会坑到你的那些部分。

多年来我配置过很多缓存方案,而当我想要的是控制权而非一键魔法时,W3TC 是我的首选。读完本文,你将了解每个缓存层的作用、何时启用、何时关闭,以及如何通过代码驱动整个系统。

目录 隐藏

通俗解释缓存

[W3 Total Cache 适合谁使用](#W3 Total Cache 适合谁使用)

入门指南:设置向导与性能菜单

缓存层,逐一介绍

常规设置:总控制面板

页面缓存:最重要的缓存层

压缩:更少的字节,更少的请求

数据库缓存:将查询结果存于一个盒子中

对象缓存:内部查找

浏览器缓存:告知浏览器保留内容

CDN:将静态文件推送到边缘

用户体验:懒加载和延迟脚本

[扩展:集成与 Pro 额外功能](#扩展:集成与 Pro 额外功能)

[Disk、Redis 或 Memcached:选择存储引擎](#Disk、Redis 或 Memcached:选择存储引擎)

不要一次开启所有层并直接上线

[片段缓存与开发者 API](#片段缓存与开发者 API)

通过代码刷新缓存

w3tc_can_cache:代码中的总开关

响应缓存刷新

片段缓存:缓存动态页面的一部分

读取配置

WP-CLI

[W3 Total Cache 与 WP Rocket](#W3 Total Cache 与 WP Rocket)

定价与授权

常见问题

总结与思考

通俗解释缓存

如果你已经了解页面缓存的原理,可以直接跳到后面。如果不了解,接下来的几段话会让你明白一切。

WordPress是一个数据库驱动的内容管理系统。这个说法听起来有点干巴巴的,但正是它导致了你的网站变慢。每次有人打开页面,服务器都会运行PHP,PHP向MySQL请求文章,主题和每个启用的插件都对该内容执行钩子,然后最终的HTML才会发送到浏览器。整个链条在每次访问时都会运行,即使页面自上次以来没有任何变化。

缓存会短路这个链条。服务器不再从头重建页面,而是保留一份结果副本,并将该副本交给下一位访问者。

静态HTML是最大的优势。 第一次请求页面时,W3TC会将最终的HTML保存到一个文件中。第二位访问者直接从磁盘获取该文件:没有PHP,没有MySQL,没有主题,没有插件。这就是"页面缓存"的含义,也是为什么缓存页面可以在几毫秒内提供服务,而在共享主机上,冷PHP请求通常需要半秒以上。

不过,这里要坦诚地说。缓存并不会让WordPress变得更快,它绕过了WordPress。你实际能获得多少提升取决于你的服务器、你选择的缓存后端,以及你网站的初始负载。一个已经通过文件提供的页面,再添加三个缓存层也不会显著加快。我会反复强调这一点,因为W3TC让你非常容易添加那些对你毫无帮助(甚至更糟)的缓存层。

缓存不止一种,而这正是W3TC比几乎所有其他插件都更深入的部分。页面缓存存储整个页面。对象缓存存储WordPress内部查询的结果。数据库缓存存储查询结果。浏览器缓存告诉访问者的浏览器在本地保留静态文件。每一个都针对不同的工作环节,W3TC为每个缓存都提供了独立的设置界面。

W3 Total Cache 适合谁使用

W3 Total Cache 是一套性能优化套件,而非单一功能的开关。它最初由 Frederick Townes 以 W3-EDGE 名义开发,现在由 BoldGrid 维护。其免费核心拥有超过一百万的活跃安装量,是全球部署最广的性能插件之一。付费版本是 W3 Total Cache Pro。

该插件的核心特点就是精细控制。有些缓存插件只提供一个"优化我的网站"按钮,而 W3TC 则把整个控制面板交给你。每一个缓存层都可以独立配置,并且可以指向不同的存储后端。这是它真正的差异化优势,也是 W3TC 被认为难以驾驭的原因。

那么,它适合哪些人呢?

希望掌控一切的开发者或代理机构。 如果你了解什么是数据库缓存,如果你正在使用 Redis 或 Memcached,如果你想自行编写精确的浏览器缓存标头,那么 W3TC 就是为你打造的。那些精细的配置界面是特性,而非负担。

拥有良好主机且愿意阅读文档的网站所有者。 你不必是开发者,但必须是那种在切换设置前会先阅读其作用的人。W3TC 会很乐意让你把自己的网站搞砸,而且不会在过程中手把手教你。

精打细算的网站所有者。 核心功能免费且能力强大。你可以在免费版本中使用页面缓存、浏览器缓存和代码压缩,无需付费即可获得大部分日常优化收益。

我会建议哪些人另选他法? 如果你想安装一个插件,点击"优化"后就再也不用操心,那么粒度化模型会让你感到沮丧。这类读者更适合使用一个有主见的插件。我们将在与 WP Rocket 的对比中讨论这一点,而且我会公平地指出各自胜出的方面。

入门指南:设置向导与性能菜单

当你激活 W3TC 后,它会添加一个顶级 性能 菜单到你的 WordPress 后台,并提供一个 设置向导 首次运行时的向导。我实际上建议第一次使用时逐步完成这个向导,这并非我对每个插件都会给出的建议。设置向导会测试你的服务器支持情况(例如,它可以探测对象缓存后端),并在带你进入完整设置之前,开启合理的功能层。

完成向导后,所有内容都位于 性能 在管理员侧边栏中。第一站是 性能 >> 常规设置,这是整个插件的主开关。每个缓存层在这里都有一个开关按钮,以及一个下拉菜单来选择其存储引擎。可以将此页面视为配电盘:你在这里打开各层,然后进入每个层自己的屏幕进行微调。

提示: 在"常规设置"顶部附近有一个"预览模式"按钮。启用后,你的更改仅应用于前端预览(通过一个 ?w3tc_preview 请求),而不会影响真实访客。这是使用此插件时唯一最好的习惯,因为它能让你在实际流量看到之前确认某项设置没有破坏任何东西。我将在反模式部分再次强调这一点,因为它非常重要。

还有一件事值得提前了解。W3TC 会将规则写入你的 .htaccess (在 Apache 和 LiteSpeed 上)或生成配置让你粘贴到 nginx 中。大多数情况下它会自动为你处理,但如果你用的是 nginx 且某些内容没有缓存,这是首先要查看的地方。

缓存层,逐一介绍

这是 W3TC 的核心,也是本文的核心。每个层都是一个独立的功能,拥有自己的管理屏幕。在逐一讲解之前,先大致了解一下布局:

缓存的内容 何时启用 注意事项
页面缓存 页面的完整 HTML 几乎总是,首先 已登录/动态页面需要谨慎处理
压缩(Minify) CSS、JS、HTML 字节和请求数 在页面缓存之后,手动模式 自动+合并可能会破坏主题
数据库缓存 SQL查询结果 仅适用于 Redis/Memcached 磁盘上可能比关闭更慢
对象缓存 内部WordPress查询 仅适用于 Redis/Memcached 磁盘上可能比关闭更慢
浏览器缓存 访客浏览器的头部指令 几乎总是 错误的过期值可能导致提供过时的资源
CDN(内容分发网络) 来自边缘网络的静态文件 当你使用CDN时 设置及URL重写的繁琐性
用户体验 懒加载、延迟脚本 针对图片较多的页面 对 LCP 图片进行懒加载会损害其性能

接下来,我们逐一打开它们。

常规设置:总控制面板

一切从这里开始。 性能 >> 常规设置 列出每个缓存层,并附带启用复选框和存储引擎下拉菜单。页面缓存、压缩、数据库缓存、对象缓存、浏览器缓存、CDN、用户体验:它们都位于此页面上,每项占一行。

它的作用: 它是一个开关面板。它不进行任何微调;只是决定哪些层处于活动状态以及每个层的数据存储位置。

何时在此处启用某个层: 一次只启用一个,千万不要同时全部启用。避免出问题的做法是:启用页面缓存,保存,测试站点,然后进入下一层。常规设置页面也是开启预览模式和"清空所有缓存"按钮所在的地方。

注意事项: 每行中的引擎下拉菜单是页面上最关键的选项,而且很容易被忽略。在没有真正的内存后端的情况下,将数据库缓存或对象缓存设置为"硬盘"是经典的 W3TC 错误。更多内容将在存储引擎部分讨论,因为它值得单独讨论。

页面缓存:最重要的缓存层

如果你只想启用一个缓存层,那就启用它。 性能 >> 页面缓存 这里是静态 HTML 的魔法发生的地方。它将整个 PHP 加数据库的渲染过程转化为一个平面文件,服务器可以直接分发,完全无需调用 WordPress。

它的作用: 缓存页面和文章的生成 HTML。在缓存命中时,访客直接获取保存的文件。在缓存未命中时,W3TC 会构建一次页面,存储它,然后从那时起提供存储的副本。

该屏幕为您提供了缓存内容和方式的详细列表:

  • 缓存首页缓存内容源 对于内容型网站,通常可以安全地保持开启。
  • 缓存 SSL(HTTPS)请求 任何现代网站都应开启此选项,因为现在几乎所有流量都基于 HTTPS。
  • 缓存 404 页面 默认是关闭的。我通常会保持关闭,除非你的网站正遭受大量访问死链的机器人攻击。
  • 缓存 REST API 如果你的前端依赖 WP REST API,该选项可能会有帮助,但需要仔细测试,因为过时的 API 响应会导致不易察觉的 Bug。
  • 不要为已登录用户缓存页面 默认开启,关闭前请慎重考虑。(反模式部分将详细解释原因。)

还有一个 清除策略 用于控制发布或更新文章时清除哪些页面(文章本身、首页、存档页、Feed),以及一个 缓存预加载 选项,它会爬取你的站点以预热缓存,让第一个真实访问者不会遇到冷页面。

关键在于: 任何个性化的内容都不能被缓存并错误地提供给其他人。购物车、账户页面以及任何"Hi, name"问候语本质上都是动态的。W3TC 排除了明显的这些,但如果你构建了自定义内容,你有责任告诉缓存跳过它。这就是 w3tc_can_cache 开发者设置中的过滤器的作用所在。

压缩:更少的字节,更少的请求

性能 >> 压缩 去除 CSS、JavaScript 和 HTML 中的空白和注释,并可将多个文件合并以减少请求次数。通常来说,文件更小加上往返次数更少意味着更快的渲染速度,至少原则上是这样。

功能简介: 压缩(移除不需要的字符)并可选择合并 CSS 和 JS。它还可以内联小型 CSS/JS、延迟非关键脚本,并压缩 HTML 输出。

顶部有一个关键选择: 自动 模式与 手动 模式。

  • 自动 模式会尝试为您查找并压缩每一个样式表和脚本。它很方便,但也是该插件导致主题白屏的最常见原因。
  • 手动 模式要求您精确指定要包含哪些文件以及它们的顺序。工作量更大,但安全得多。

注意: 合并文件会改变 CSS 和 JS 的加载顺序,而顺序至关重要。如果您的主题样式表期望某个依赖项先加载,而压缩工具打乱了顺序,就会导致布局错乱、脚本报错。在 HTTP/2 和 HTTP/3 下,'合并'带来的收益也比以前小了,因为浏览器本身就能并行获取多个文件。

何时启用它: 在确认页面缓存正常工作后,我会从手动模式开始(或者至少在触及实际流量之前,在预览模式下测试自动模式)。压缩功能最需要谨慎对待。

数据库缓存:将查询结果存于一个盒子中

此功能没有单独的截图,因为它的界面很短,真正的决策在于引擎,而不是开关。 性能 >> 数据库缓存 存储 SQL 查询的结果,这样 WordPress 就不必反复执行相同的查询。

它的作用: 缓存数据库查询结果,使重复查询可以从缓存中获取,而无需再次访问 MySQL。

注意事项,请仔细阅读两遍: 当引擎设置为 磁盘 ,数据库缓存可能 更慢 比完全没有缓存还要慢。你是在用快速的数据库读取换取磁盘读取加上管理缓存文件的开销,而在共享主机上,磁盘通常很慢且与其他租户共享。数据库缓存只有在底层使用内存存储(如 Redis 或 Memcached)时才真正有效,此时读取速度确实比直接访问 MySQL 更快。

诚实地说,我的建议是:除非你使用了 Redis 或 Memcached,否则请关闭 Database Cache。在典型的共享主机上,如果引擎使用磁盘缓存,这层缓存只会增加风险,不会提升速度。

对象缓存:内部查找

性能 >> 对象缓存 缓存 WordPress 内部的"对象"查找,即 WordPress 在请求过程中计算的小型重复结果(选项值、术语查找、用户元数据等)。

它的作用: 它提供持久的对象缓存。如果没有持久缓存,WordPress 的对象缓存仅持续单个页面加载。当 W3TC 的对象缓存指向持久后端时,这些结果会在请求之间保留。

该界面显示了默认的对象生命周期(默认为 180 秒)、垃圾回收间隔(600 秒)、对全局和非持久缓存组的控制,以及可选在 WordPress 后台也缓存对象的选项。

其陷阱与 Database Cache 相同,也是人们对 W3TC 最误解的一点。 持久的对象缓存开启 磁盘 可能比不使用还要慢,因为你把廉价的内存操作变成了磁盘 I/O。对象缓存在配有 Redis 的 VPS 上表现出色,但在基于磁盘的廉价共享主机上却是个累赘。

我特意将对象缓存屏幕放在存储引擎部分,因为引擎选择 这里的核心功能。在错误的后端缓存错误的内容,正是许多人最终确信"W3TC 拖慢了我的网站"的原因。其实不是 W3TC 的错,而是糟糕主机上的磁盘引擎导致的。

浏览器缓存:告知浏览器保留内容

性能 >> 浏览器缓存 不会在服务器上缓存任何内容。它设置 HTTP 标头,告知 访问者的 浏览器保留静态文件(图片、CSS、JS、字体),这样回访的访问者就无需重新下载它们。

它的作用: 它管理缓存相关的响应标头: Last-ModifiedExpiresCache-Control以及 ETag。它还可以启用 gzip 和 Brotli 压缩,并添加一组安全相关的标头。

这是整个插件中最简单、最安全的优化之一。对于回访用户,重新下载 CSS 包与从本地缓存读取之间的差别,就是一次网络往返与零次网络往返的差别。

注意: 如果过期时间设置得过于激进,在更改 CSS 或 JS 文件后,可能会向回访用户提供过时的版本。W3TC 会处理其自身压缩文件的缓存失效,但如果您对手动更改的资源设置了较长的过期标头,请在更新时附加版本查询字符串,以便浏览器获取新副本。

提示: 这里的压缩开关(gzip / Brotli)在大多数主机上都是纯粹的增益。压缩后的文本资源在传输时体积大幅减小,现代浏览器都支持。

CDN:将静态文件推送到边缘

性能 >> CDN 它将静态文件的 URL 重写为从内容分发网络加载,而不是从源服务器加载。CDN 会在全球各地的数据中心保存文件的副本,因此悉尼的访客可以从附近的边缘节点获取您的 Logo,而不是从法兰克福的主机获取。

功能说明: 它将附件、文件、主题文件和压缩文件卸载到 CDN 主机,并在页面的 HTML 中重写它们的 URL。W3TC 支持通用的镜像 / 拉取 / 推送 CDN 模式,以及直接集成,包括 Bunny CDN、Amazon CloudFront 和 Rackspace。(Bunny 是当前 UI 中 W3TC 最突出的合作伙伴。) wp-includes 启用时机:

当您确实拥有 CDN 且受众不局限于同一城市时。服务于单一地区的本地小企业站点从 CDN 中获益有限;而面向全球受众、媒体内容丰富的站点则会受益匪浅。 注意事项:

对于大多数人来说,CDN 配置是 W3TC 中最繁琐的部分。您必须正确设置 CNAME,确保 CDN 从正确的源拉取内容,并确认重写后的 URL 确实可解析。混合内容错误和损坏的图片 URL 通常是初次尝试失败的常见问题,因此请在预览模式下测试并在上线前检查页面源代码。

对大多数使用者而言,配置 CDN 是 W3TC 插件里最繁琐棘手的环节。你必须正确设置 CNAME 记录,确保 CDN 能从正确的源站拉取资源,还要校验重写后的 URL 能够正常解析。 初次配置最常出现两类问题:混合内容报错、图片链接失效。因此正式上线前,务必先用预览模式测试,并查看网页源代码核对资源地址。

用户体验:懒加载和延迟脚本

性能 >> 用户体验 这是 W3TC 针对访客真实感知速度的前端加载技巧的核心区域。这也是近期更新中增长最快的层面。

它的作用: 它可以懒加载图片和背景图片(因此视口下方的图片仅在滚动到时才加载)、延迟脚本、延迟 Google 地图,并致力于消除渲染阻塞 CSS。

懒加载是这里的重头戏,对于较长的、图片丰富的页面来说,它确实能节省带宽。从不滚动到底部的读者就不会下载那里的图片。

但有个真正的陷阱: 永远不要懒加载你最大的首屏图片,通常是主图。该图片几乎总是你的 Largest Contentful Paint(最大内容绘制)元素,延迟它会让你 LCP 分数变得 更差,而不是更好。大多数懒加载实现正是因为这个原因会跳过第一两张图片,但若你有一张大型自定义主图,请显式排除它并测试。懒加载是用于视口下方内容的工具。

扩展:集成与 Pro 额外功能

性能 >> 扩展 W3TC 在这里接入外部服务,同时也是多个 Pro 功能所在之处。它是一个需要逐个激活的模块列表,而非独立的设置界面。

它的作用: 它承载着集成扩展。Cloudflare 扩展让 W3TC 能够清除 Cloudflare 的缓存并读取其分析数据。还有针对 AMP 和 New Relic 等功能的扩展,开发者 API 所接入的片段缓存(Fragment Cache)支持也位于插件的这一部分。

它的亮点: 如果你在网站前面使用了 Cloudflare,那么 Cloudflare 扩展意味着一次"清除"操作即可同时清除 W3TC 的缓存和 Cloudflare 的边缘缓存,无需你登录两个管理面板。这正是你期望从一套解决方案中获得的集成体验。

需要注意: 扩展的深度各不相同,一些更高级的扩展(以及片段缓存机制)与 W3 Total Cache Pro 绑定。不要认为你看到的每个扩展在免费核心版中都能完全运行;请检查你的授权包含哪些内容。

Disk、Redis 或 Memcached:选择存储引擎

这是区分使用W3TC受益的人和悄悄用它搞坏网站的人的关键部分。W3TC不只是缓存,它让你选择 在哪里 每一层存储它的数据,而这个选择至关重要。

W3TC开箱即用支持多种存储引擎: 磁盘 (file), 磁盘:增强版 (file_generic), RedisMemcachedAPC/APCuapc),外加更老的选项如 eAccelerator、XCache、WinCache,以及一种 nginx 加 Memcached 的模式。并非每种引擎在所有地方都适用。只有当您的服务器实际安装了相应模块时,引擎才能工作,而一个全新的演示沙盒无法证明它们在您特定的主机上有效。您必须检查您的主机支持哪些。

以下是实际细分。

磁盘和磁盘:增强 将缓存作为文件存储在服务器的文件系统上。 页面缓存,这很棒,而且"磁盘:增强版"是专门设计用来让 Web 服务器直接提供缓存的 HTML 文件,甚至无需加载 PHP。对于大多数网站(包括共享主机)来说,使用"磁盘:增强版"进行页面缓存是标准且推荐的设置。

Redis 和 Memcached 是内存存储。它们将数据保存在 RAM 中,读取速度比磁盘文件快得多,并且它们专为对象缓存和数据库缓存生成的那种小型、频繁的查询而设计。这正是 W3TC 的多引擎支持的价值所在:仅支持磁盘缓存的插件根本无法做到这一点。

现在,关键且重要的一点是: 磁盘上的对象缓存和数据库缓存可能比完全没有缓存还要慢。 想想这些层的作用:它们存储成千上万的小结果。从共享的、可能较慢的磁盘上读取成千上万个小文件,并管理它们的过期时间,其成本可能比让 WordPress 和 MySQL 直接处理还要高。在内存引擎上,同样的读取操作确实比原始查询更快。而在磁盘上,尤其是在廉价的共享主机上,你往往白白增加了开销。

所以我实际使用的经验法则是:

  • 页面缓存: 磁盘:增强版。适用于任何环境,快速且安全。
  • 浏览器缓存: 不是存储选择,只是 HTTP 头。始终开启。
  • 对象缓存和数据库缓存: 仅在你有 Redis 或 Memcached 时才启用它们。如果你在使用没有内存后端的共享主机,请将两者都关闭。磁盘在这里不能替代。

角色检查。 共享主机上的博主应将页面缓存设置为 Disk: Enhanced,开启浏览器缓存,完全关闭对象/数据库缓存。使用安装了 Redis 的 VPS 的机构应该绝对开启指向 Redis 的对象和数据库缓存,它们将真正加速具有繁重管理或 WooCommerce 的网站。托管主机上繁忙的 WooCommerce 商店通常有 Redis 可用;这就是 W3TC 的对象缓存成为真正资产的地方,因为 WooCommerce 在每次请求时都会频繁读写选项表和用户元数据。

如果你想减少网站的工作量 它到达缓存之前,像 Perfmatters 这样的脚本管理器可以与任何缓存很好地配合:它按页面禁用插件臃肿,从而一开始就减少需要缓存的内容。如果你的缓慢部分是由于臃肿的数据库(多年的修订版本、过期的瞬态、孤立的元数据),那么像 WP-Optimize 这样的清理工具会解决问题本身,而不是缓存症状。

不要一次开启所有层并直接上线

这就是错误所在,我见过聪明的人也犯过。W3TC 的常规设置页面会诱惑你勾选所有复选框,设置几个引擎,点击保存,然后就以为完事了。别这么做。会有三个问题,每个都会带来实际代价。

启用 Minify 会导致主题白屏。 启用了合并功能的自动模式会重新排列你的 CSS 和 JS 的加载顺序。如果你的主题依赖于特定的顺序(大多数主题如此),页面会渲染无样式或脚本报错。代价是前端崩溃,你的访问者会看到,而你则需要花时间排查是哪个文件造成的:失去信任、失去销售、耗费你一个晚上的时间。

将对象缓存或数据库缓存设置为磁盘会使网站变慢。 在共享主机上将这些缓存层指向磁盘,就是用快速的內存工作换取缓慢的磁盘 I/O。在你"优化"之后,网站感觉更糟,你还浪费时间去追逐一个幻影。只有使用 Redis 或 Memcached 时这些缓存才有意义。

页面缓存会泄漏已登录用户的内容。 不小心勾选"为已登录用户缓存页面"后,W3TC 可能会把一个用户缓存的页面(他们的名字、账户、购物车)提供给下一个访问者。这不仅仅是速度变慢,而是数据泄露事件和真正的隐私问题。

诚实的修复方法简单得令人无聊:

  1. 一次只启用一个缓存层,先启用页面缓存。保存,在未登录的浏览器中硬刷新前端,点击各处,确认没有破坏任何东西。
  2. 使用预览模式 对于任何有风险的操作, 将 Minify 保持在手动模式, 直到你在主题上验证通过。
  3. **仅在配合 Redis 或 Memcached 时启用对象/数据库缓存,**除非有切实理由,否则保持登录缓存关闭。

慢而稳定胜过快而故障。验证只需两分钟;跳过它可能浪费你一个晚上并失去访客的信任。

片段缓存与开发者 API

在此,W3TC 不再只是一个设置面板,而成为你可用编程控制的工具。其公开 API 有文档记录且稳定,这正是开发者选择 W3TC 的真正原因。如果你维护自定义站点,这部分值得收藏。

通过代码刷新缓存

编程中最常见的操作是在自己的代码修改某些内容后清除缓存。W3TC 提供了一组简洁且签名可预期的刷新函数。

bash 复制代码
// Clear every cache layer at once.
w3tc_flush_all();

// Flush a single post (and its related archives).
// Signature: w3tc_flush_post( $post_id, $force = false, $extras = null )
w3tc_flush_post( 1234 );

// Flush one specific URL.
w3tc_flush_url( 'https://example.com/pricing/' );

// Flush a named cache group.
w3tc_flush_group( 'product-feed' );

一个实际的例子:假设你通过 cron 任务从外部 API 拉取产品数据并写入文章。WordPress 不知道内容已更改,因此缓存的页面保持过时。更新后只需刷新那篇文章:

bash 复制代码
add_action( 'my_plugin_after_product_sync', function ( $post_id ) {
    // We rewrote this post's content from the external feed,
    // so clear its cached HTML and let it rebuild on next visit.
    w3tc_flush_post( $post_id );
} );

如果你只想清除特定层而不是全部,W3TC 也提供了按层刷新的函数:

bash 复制代码
w3tc_pgcache_flush();      // page cache only
w3tc_dbcache_flush();      // database cache only
w3tc_minify_flush();       // minified CSS/JS bundles
w3tc_objectcache_flush();  // object cache only

使用更精确的函数而不是 w3tc_flush_all() 在繁忙的站点上很重要。清空全部意味着每个页面都必须从头重新生成,这会在你不希望的时候导致服务器负载激增。只刷新你更改的文章,而不是整个站点。

w3tc_can_cache:代码中的总开关

这是我最常使用的过滤器。 w3tc_can_cache 决定 W3TC 是否缓存当前请求。返回 false 且页面每次都提供最新内容,不做缓存。

bash 复制代码
add_filter( 'w3tc_can_cache', function ( $can_cache ) {
    // Never cache a request that carries our preview token,
    // even for logged-out users.
    if ( isset( $_GET['live_preview'] ) ) {
        return false;
    }
    return $can_cache;
} );

这相当于界面中"不缓存此页面"复选框的编程实现,但决策背后拥有 PHP 的全部能力。任何能用代码表达的条件(自定义 Cookie、查询标志、功能开关)都可以使页面不被缓存。

响应缓存刷新

W3TC 在清除缓存时触发动作钩子,以便您可以做出响应。其中最有用的两个是 w3tc_flush_allw3tc_flush_post

bash 复制代码
// Warm a critical page back up immediately after a full flush,
// so the first real visitor doesn't hit a cold cache.
add_action( 'w3tc_flush_all', function () {
    wp_remote_get( home_url( '/' ), array( 'blocking' => false ) );
} );

// Log which posts were flushed, for debugging stale-content reports.
add_action( 'w3tc_flush_post', function ( $post_id ) {
    error_log( 'W3TC flushed post ' . $post_id );
} );

这些钩子是其他插件与 W3TC 缓存集成的方式,也是您让自己的缓存层与 W3TC 保持同步的方式。

片段缓存:缓存动态页面的一部分

片段缓存是 W3TC 更具特色的功能之一(也是与专业版相关的功能)。其理念:有时页面整体是动态的,但包含一个不常变更的重负载部分。页面缓存是全有或全无的,因此无法解决该问题。而片段缓存可以只缓存那部分。

设想一个侧边栏小工具,它在页面上运行一个繁重的查询(比如本月热销产品),而页面其他部分是个性化的且无法进行页面缓存。您需要注册一个片段组,然后将高成本输出包裹在片段缓存调用中,这样小工具的 HTML 被缓存,而页面的其余部分保持动态。

概念上看起来像这样(具体参数请遵循 W3TC API):

bash 复制代码
// Register a fragment group with an expiration, hooked to relevant events.
w3tc_register_fragment_group( 'bestsellers_widget', array( 'save_post' ), 3600 );

// Then, where you render the expensive widget:
if ( function_exists( 'w3tc_fragmentcache_start' ) ) {
    if ( ! w3tc_fragmentcache_start( 'bestsellers', 'bestsellers_widget' ) ) {
        render_bestsellers_widget(); // the expensive bit
        w3tc_fragmentcache_end( 'bestsellers', 'bestsellers_widget' );
    }
}

当片段被缓存时, w3tc_fragmentcache_start 会短路并输出存储的HTML;如果不是,则渲染一次并 w3tc_fragmentcache_end 存储它。你通过对应的刷新片段组。 w3tc_fragmentcache_flush_group 调用。它是一个精准工具:大多数网站永远用不到它,但当一个不可缓存的页面上有一个昂贵的组件时,WordPress缓存世界中其他任何方案都没有如此干净利落。

读取配置

如果你的代码需要了解W3TC是如何设置的, w3tc_config() 返回配置对象:

bash 复制代码
$config = w3tc_config();
$page_cache_enabled = $config->get_boolean( 'pgcache.enabled' );

当集成需要根据某个层是否激活而采取不同行为时,这很方便。

WP-CLI

W3TC在以下命令下注册WP-CLI命令 w3-total-cache (使用 w3tctotal-cache 作为别名),这正是部署脚本和 cron 任务所需要的。清除命令是核心操作:

bash 复制代码
# Clear every cache after a deploy.
wp w3-total-cache flush all

# Same thing, using the short alias.
wp w3tc flush all

# Flush a single post or a single URL.
wp w3-total-cache flush post --post_id=1234
wp w3-total-cache flush post --permalink=https://example.com/pricing/

接入 wp w3-total-cache flush all 到部署管道的末尾,你就再也不会发布被过时缓存隐藏的 CSS 更改了。对于日常的内容编辑,逐篇文章清除比整体清除对服务器更友好。

如果你对编写 WordPress 钩子和过滤器比较陌生,官方 WordPress 开发者手册是最好的免费参考,它介绍了如何 add_actionadd_filter 实际工作。

W3 Total Cache 与 WP Rocket

这是每个人都想看到的对比,所以让我对两者都公平一些。我很喜欢 WP Rocket,也很喜欢 W3TC,原因不同,适合不同的人群。它们处于同一光谱的两端:一种固执且自动化,另一种细致且手动。

让我们用真实数据说话,而不是空谈。

W3 Total Cache WP Rocket
起步价格 基础版免费(专业版增加额外功能) 仅付费,每站点每年约432元($60),依据 WP Rocket 定价
管理界面 约16个设置界面 约8个标签页
存储引擎 6种及以上(磁盘、增强型磁盘、Redis、Memcached、APC等) 仅磁盘
激活后缓存 您自行启用各层 自动开启,采用合理默认值
学习曲线 陡峭、细致 平缓、引导式

该表格中有几点值得注意。

W3TC 起步免费;WP Rocket 从一开始就要付费。 WP Rocket 完全没有免费版本。W3TC 的核心功能免费处理页面缓存、浏览器缓存和代码压缩。如果预算是决定性因素,这确实是实实在在的差距,而非小区别。

W3TC 暴露了更多的面。 大约十六个设置屏幕,而另一个只有大约八个标签页。这并不自动说明 W3TC 更有优势,更多的屏幕意味着更多需要学习的内容和更多配置出错的可能,但如果你想要控制精确的浏览器缓存标头或为每一层运行不同的引擎,你需要这些屏幕。

存储引擎是 W3TC 的结构性优势。 六大引擎与仅磁盘缓存。WP Rocket 仅缓存到磁盘,没有其他,对于大多数网站来说这确实没问题。但如果你有 Redis 或 Memcached 并且想要一个真正的持久化对象缓存,W3TC 可以使用它们,而 WP Rocket 不能。对于 VPS 上数据库密集型的 WooCommerce 商店来说,这就是区别所在。

在某些方面,两者获得的性能提升是相同的。 回访用户无论哪种方式都能从浏览器缓存标头中受益,这可以将重复访问时重新下载的字节数减少 80% 或更多,而 gzip 或 Brotli 压缩可以将 CSS 和 JS 通过网络传输的大小减少大约 70%,无论由哪个插件设置。这些收益来自 HTTP 本身,而不是插件的标志,因此它们不会影响两者之间的选择。

现在来看另一面,因为这不是一边倒的批评。

在易用性上,WP Rocket 遥遥领先。 你安装它,页面缓存、浏览器缓存标头和 GZIP 就已经启用了,并且带有合理的默认值,在你触碰任何设置之前。它的大部分优势来自于别人已经做好的决策。对于那些想要"快速"而不需要学习曲线的读者来说,这值得付费。

WP Rocket 的默认值更安全。 它自动排除购物车和结账页面,能检测托管主机并禁用冲突功能,而且更不容易误操作。W3TC 会让你犯下上面反模式部分中的每一个错误;而 WP Rocket 默认会关闭更多的风险入口。

我不会告诉你哪个更快,因为我没有控制测试的基准数据,任何不说明方法就告诉你"X 更快"的人都是在猜测。两个插件配置好的页面缓存都能将你的动态页面转化为静态文件;实际差异更多地取决于你的服务器、后端和配置,而不是插件的标志。选择 W3TC 是为了控制和免费起步。选择 WP Rocket 是为了省心易用。两者都不错。

定价与授权

W3 Total Cache 采用免费核心加付费 Pro 模式。核心插件在 WordPress.org 上免费,本身功能相当强大:页面缓存、浏览器缓存、压缩和基本 CDN 模式都免费提供。对于这么深入的插件来说很不寻常,这也是 W3TC 拥有庞大安装量的一个重要原因。

W3 Total Cache Pro 是付费版本。据供应商介绍,Pro 增加了更高级的功能:片段缓存、全站交付 CDN、REST API 缓存、Google 地图延迟加载、阻塞渲染 CSS 处理,以及缓存统计和分析。这里我要谨慎一些,因为免费版和 Pro 版之间的确切界限会在版本间变动,我不想把一个功能边界当作不变的真理。将 Pro 列表视为"BoldGrid 提供的高级附加功能",在决定前请到官网确认当前的区别。

层级 适用对象 包含内容
免费核心 大多数博客和小型网站 页面、浏览器、压缩、基础 CDN、所有引擎
W3 Total Cache Pro 高级用户、机构、商店 片段缓存、全站 CDN、REST 缓存、统计

顺便说一下,一个快速的网站不仅仅是缓存。 即使是最佳的缓存配置也无法修复数兆字节的图片。将 W3TC 与像 Smush Pro 这样的图片优化器配合使用,可以解决另一半问题,因为缓存可以更快地提供图片,但不会让它们变小。

常见问题

W3 Total Cache 是免费的吗?

是的,核心插件在 WordPress.org 上是免费的,不是一个功能受限的试用版。页面缓存、浏览器缓存、压缩和基础 CDN 模式在免费版本中都可以使用,这足以满足大多数博客和小型企业网站的需求。W3 Total Cache Pro 是一个独立的付费版本,添加了高级功能,如片段缓存和全站 CDN 交付。

W3TC 很难设置吗?它会破坏我的网站吗?

它比一键式插件更复杂,是的,如果你一次性开启所有功能,它可能会让你的网站崩溃。危险点在于 Minify(它会打乱 CSS/JS 加载顺序)以及在共享主机上将对象缓存或数据库缓存指向磁盘引擎。解决方法是讲究条理:一次只启用一层,每层后测试前端,对任何有风险的操作使用预览模式。仔细设置的话,它不会破坏任何东西;粗心设置的话,它绝对会。

W3 Total Cache vs WP Rocket:我该选哪个?

如果你想要精细控制、免费起点,或者真正的 Redis/Memcached 对象缓存,选 W3TC。如果你想要开箱即用的合理默认设置,并且不想了解数据库缓存是什么,选 WP Rocket。W3TC 有更多设置页面(大约十六个)和更多缓存引擎(六个以上);WP Rocket 选项卡较少(大约八个),仅支持磁盘缓存,学习曲线平缓得多。两者没有绝对谁更快,取决于你的配置。

使用 W3 Total Cache 需要 Redis 或 Memcached 吗?

不需要,没有它们你也可以很好地运行页面缓存和浏览器缓存,这两层提供了绝大多数日常速度提升。只有当你想要开启对象缓存或数据库缓存时才需要 Redis 或 Memcached,因为在磁盘引擎下,这些层实际上可能比关闭它们更慢。没有内存缓存后端?那就关闭对象缓存和数据库缓存,你不会损失任何重要东西。

W3 Total Cache 本身能加快我的网站速度吗?

它消除了一个主要瓶颈,但并非魔法开关。页面缓存将 PHP 和数据库工作转化为静态 HTML 文件,响应时间大幅缩短;压缩功能减少了字节数和请求数。实际能获得多少提升取决于你的服务器、缓存后端以及网站原有的负载程度。一个因为超大未优化图片或阻塞渲染的第三方脚本而变慢的网站,单靠缓存无法完全解决;这些问题需要单独处理。

磁盘缓存还是 Memcached 缓存,有什么区别?

磁盘缓存将缓存以文件形式存储在服务器上;Memcached(以及 Redis)将缓存存储在内存中。对于页面缓存,Disk: Enhanced 是正确且推荐的选择,适用于所有环境。对于对象缓存和数据库缓存,内存引擎明显胜出,因为它们的读取速度比它们所替代的数据库查询更快,而磁盘缓存往往会增加 I/O 开销,在共享主机上抵消了优势。

W3 Total Cache Pro 值得付费吗?

这取决于你是否需要付费版的功能。免费核心版已涵盖页面缓存、浏览器缓存和压缩缓存,这对典型网站来说已经能带来大部分性能提升。如果你特别需要针对昂贵动态小部件的片段缓存、全站CDN分发、REST API缓存或缓存统计,那么Pro版是值得的。对于简单的博客,免费版通常足够;对于代理机构或高负载商店,Pro版的额外功能可能物有所值。

W3 Total Cache 是否兼容我的主机和 Cloudflare?

大部分情况可以,但有一个注意事项。在 Apache 和 LiteSpeed 上,它可以管理 .htaccess .htaccess 规则本身;在 nginx 上,它会生成你可能需要添加到服务器配置中的设置,这是最常见的"缓存为什么不工作"的原因。它有一个专门的 Cloudflare 扩展,让你从 WordPress 内部清除 Cloudflare 的边缘缓存,因此两者配合良好。如果你的主机已经进行了激进的服务器级缓存,请协调两者以避免重复缓存。

我可以将 W3TC 与像 ElementorDivi 这样的页面构建器一起使用吗?

可以。需要注意 Minify(压缩)功能,因为页面构建器自带很多 CSS 和 JS,合并或重新排序它们会导致问题。将 Minify 设置为手动模式(或在预览中测试),确认构建器的页面渲染正确,就没事了。页面缓存和浏览器缓存无需特殊处理即可正常工作。

发布文章后如何清除缓存?

当你发布或更新文章时,W3TC 会根据你的清除策略(通常是文章、首页、存档页和 feed)自动清除相关页面。你也可以通过"性能"菜单下的"清空所有缓存"按钮手动清除所有缓存,或者通过命令行使用 wp w3-total-cache flush all对于在你自己的代码中编程清除缓存, w3tc_flush_post( $post_id ) 仅清除一篇文章。

总结与思考

W3 Total Cache 是适合想了解内部机制用户的缓存插件。每个层级都是一个开关,每个开关都有引擎,没有任何隐藏。这种开放性既是其最大优点,也是其最大风险。只要耐心操作(一次一层,测试后再下一层,为每项任务选择合适引擎),它就能提供任何一键插件都无法比拟的控制水平,并且其免费核心已覆盖大多数站点。

我诚实的总结:在每个站点上启用 Disk: Enhanced 页面缓存和浏览器缓存,如果你有支持 Redis 的 VPS,则添加 Redis 支持的对象和数据库缓存,谨慎使用 Minify,并利用 flush API 和 WP-CLI 从你自己的代码中保持一切同步。这样做,W3TC 就能默默无闻地为你工作多年。