WordPress 缓存机制详解:Memcached、WP Super Cache 与静态化实战

WordPress 缓存机制封面:Memcached、WP Super Cache 与静态化

前面两篇文章分别解决了带宽和服务器层面的问题,这一篇讲性能优化里收益最直观的一环:缓存。WordPress 默认每次请求都要执行 PHP、查询数据库、渲染页面,一套流程跑完才能把结果交给访客。缓存的意义就是把这套流程的结果保存下来,下次直接复用。理解 WordPress 的缓存机制,才能在合适的场景选对方案,而不是盲目装一堆缓存插件互相打架。这篇文章先讲清三种缓存机制的区别,再分别用 Memcached、WP Super Cache 和 Super Static Cache 做实战演示,每一步都有对应的配置截图。

WordPress 的三种缓存机制

WordPress 本身提供了一种叫 WordPress Object Cache 的对象缓存机制,它把需要缓存的内容按照 Key-Value 的模式存储。Key-Value 形式的读取速度远比数据库查询快得多,因为数据库查询要经过 SQL 解析、索引查找、磁盘读取等一系列步骤,而从内存或文件里按 Key 直接取值几乎是瞬时完成。围绕这个核心机制,WordPress 生态里发展出了三种缓存实现方式,它们的存储位置和性能特征各不相同。

三种缓存机制示意图:小黑站在文件缓存、内存缓存、HTML 静态缓存三条路前选择

文件缓存

文件缓存把对象缓存的内容存储为文件,对外提供服务时,WordPress 直接读取文件中的缓存数据来进行渲染和输出,不再查询数据库。这种方案的优点是实现简单、不依赖额外的服务,任何虚拟主机都能跑。但缺点也很明显:文件读写对硬盘 I/O 的要求极高,频繁读取大量小文件会拖慢整个系统,所以自从 WordPress 2.5 开始,这种缓存方式就被弃用了。不过如果你的虚拟主机实在无法运行内存缓存,也可以安装 WP File Cache 插件来启用文件缓存,作为没有更好选择时的兜底方案。

内存缓存

内存缓存把对象缓存的内容保存到内存中,下一次访问时直接到内存里获取,没有了文件缓存的磁盘 I/O 操作,SQL 查询也大幅减少,整个系统会快很多。Memcached 是这类方案的代表,它和文件缓存有一个共同点:网站的动态内容会按照功能分成很多个部分,分别对每个部分进行缓存,而不是把整个页面当作一个整体缓存。所以访问一个页面时,WordPress 还是需要从内存中读取多个内容块,再拼装成完整的页面输出。

HTML 静态缓存

HTML 静态缓存则是把整个 WordPress 页面缓存成一个静态的 HTML 文件存到服务器上。下次访问该页面时,Web 服务器不再运行 PHP 代码,直接把 HTML 文件返回给访客,CPU 占用率大大降低,页面响应速度接近纯静态网站。但这种方式也有代价:日志列表、最新文章这些动态内容不会时时更新,需要配合定时刷新或手动清理缓存。使用 HTML 静态化缓存插件时,要清楚这个特性,避免访客看到过时的内容。

内存缓存:使用 Memcached 和 Batcache

Memcached 负责数据查询的缓存。启用后,WordPress 会把从数据库查询到的数据以对象的形式缓存进内存,每次访问时直接读取内存中的对象进行页面渲染,有效减少数据库查询次数。而 BatCache 更进一步,把整个页面缓存到内存中,用户访问时 WordPress 直接读取缓存中的页面并返回给访客,响应速度再次提升。两者配合,一个是对象级缓存,一个是页面级缓存,覆盖了缓存的两个层次。

安装 Memcached 和 Batcache 是有前置要求的:一般需要独立主机而不是虚拟主机,因为要 SSH 权限来安装服务和编译扩展。不过部分国外的 cPanel 主机也提供了 Memcached 服务,可以咨询你的虚拟主机提供商确认。

安装步骤

第一步,在服务器上安装 Memcached。CentOS 系使用 yum,Debian/Ubuntu 系使用 apt,二选一执行即可:

yum -y install memcached

或使用 apt 安装,效果相同:

apt-get -y install memcached

第二步,为 PHP 编译 Memcached 扩展,让 PHP 可以调用 Memcached 服务。这一步通常用 pecl 安装 php-memcached 扩展完成,编译完成后记得重启 PHP-FPM 或 Apache 使扩展生效。

第三步,下载 Memcached 插件。到 WordPress 插件目录下载官方提供的 Memcached 插件,解压后把其中的 object-cache.php 文件移动到 wp-content 目录下。这里要特别注意:不是 wp-content/plugins/ 目录,而是直接放在 wp-content/ 根目录,WordPress 会在启动时自动加载它作为对象缓存驱动。

第四步,下载 BatCache 插件。同样到 WordPress 插件目录下载,解压后把其中的 advanced-cache.php 移动到 wp-content/ 目录。这个文件负责页面级缓存的拦截与返回逻辑。

第五步,开启缓存。在 wp-config.php 文件中加入下面这行代码,让 WordPress 正式启用缓存机制:

define('WP_CACHE', true);

保存后刷新站点,Memcached 和 Batcache 就开始工作了。如果用的是 cPanel 等面板环境,也可以在面板里确认 Memcached 服务已启动、PHP 扩展已加载,再按同样步骤操作。

HTML 静态缓存:使用 WP Super Cache

除了内存缓存,WP Super Cache 是更大众化的选择。它把整个网页直接生成 HTML 文件,Web 服务器就不用解析 PHP 脚本,访问时直接返回静态文件,WordPress 博客的加载速度会有显著提升。而且 WP Super Cache 对虚拟主机友好,不需要 SSH 权限,后台就能完成全部配置。

安装与启用

到 WordPress 插件目录下载 WP Super Cache,上传到后台安装并启用。插件启用后,设置菜单里会出现 WP Super Cache 的配置页面。进入”通用”选项卡,勾选”启用缓存功能”选项:

WP Super Cache 通用选项卡启用缓存功能

然后切到”高级”选项卡,勾选所有推荐选项。这样插件会自动针对未登录用户启用缓存,并对所有页面加入 Gzip 压缩,传输体积和服务器负载一起降下来:

WP Super Cache 高级选项卡勾选推荐选项

配置 CDN

如果站点接入了 CDN,可以在 CDN 选项卡中配置:勾选启用 CDN,填入你的 CDN 域名。WP Super Cache 会把静态资源链接改写为 CDN 地址,配合上一篇文章讲的 CDN 加速方案,效果叠加:

WP Super Cache CDN 选项卡配置 CDN 域名

清除缓存

内容更新后需要清空缓存时,进入”内容”选项卡,点击”删除已过期文件”和”删除缓存”按钮,系统缓存就会被清空,下一次访问重新生成。发布新文章后建议顺手清一次,避免访客看到旧页面:

WP Super Cache 内容选项卡删除过期文件与缓存

WP Super Cache 的功能远不止这些,但对大多数站点来说,默认设置项已经足够日常使用,不需要深入调整每个参数。

静态化:Super Static Cache 插件

如果 HTML 页面缓存还不够,想要更极致的速度,那就只能上静态化了。江湖上盛传的 cos-html-cache 插件已经太久没更新,所以这里推荐用 Super Static Cache 来做整站静态化。它把整个页面生成静态 HTML 文件,连 WordPress 的缓存判断逻辑都省了。

使用步骤

前往插件目录下载 Super Static Cache,上传到后台安装并启用。安装完成后,进入设置中的 Super Static Cache 选项,可以看到一系列配置项,选择其中一种模式开启即可:

Super Static Cache 插件设置页选择缓存模式

开启后,网站根目录下会多出一个 index.html 文件,这就是静态化的成果:

Super Static Cache 生成根目录 index.html 静态文件

这个 index.html 就是生成的静态文件,访问首页时 Web 服务器直接返回它。静态化的速度是所有缓存方案里最快的,但需要定期重新生成,适合内容更新频率较低的网站。

总结

三种缓存机制对应三种使用场景:虚拟主机无法运行内存服务时,用文件缓存兜底;有独立主机或 SSH 权限时,用 Memcached 加 Batcache 做对象级和页面级缓存,兼顾动态内容的实时性;追求极致速度且内容更新不频繁,用 Super Static Cache 做整站静态化。对大多数 WordPress 站点来说,WP Super Cache 是最均衡的选择,配置简单、效果明显、虚拟主机也能跑。缓存是 WordPress 提速性价比最高的手段,但别贪多——同时开多个缓存插件反而会互相干扰,选一条路线走到底就好。想从整体了解缓存体系的区别,站内的 WordPress 缓存类型详解把页面缓存、对象缓存、CDN 缓存的差异讲得很透彻;如果还想对比更多缓存插件的选择,12 款缓存插件推荐可以帮你挑到适合自己站点的那一款;配合速度优化 7 个实用技巧,整套提速方案就完整了。

常见问题解答(FAQ)

Memcached 和 Redis 选哪个?

Memcached 结构简单、适合纯缓存场景,和 Batcache 搭配做页面缓存很经典;Redis 支持更多数据结构、可以持久化,适合需要对象缓存加其他功能的场景。两者都能大幅减少数据库查询,选哪个主要看主机环境支持哪个。

object-cache.php 为什么不放在 plugins 目录?

object-cache.php 是 WordPress 的缓存驱动文件,放在 wp-content/ 根目录时 WordPress 启动阶段就会自动加载它,接管对象缓存;放在 plugins 目录则不会被当作缓存驱动加载,插件就白装了。

WP Super Cache 和 WP Rocket 冲突吗?

不建议同时使用。两者都是页面缓存插件,功能重叠,同时开启会导致缓存文件互相覆盖、清除缓存时相互干扰。选一个用就好,一般免费场景用 WP Super Cache,追求更多优化功能用 WP Rocket。

静态化后文章更新为什么不显示?

静态化把页面生成为 HTML 文件,更新文章后需要重新生成对应的静态文件才会显示新内容。发布文章后手动刷新一次缓存或等待插件定时重新生成即可,这是静态化的固有特性。

虚拟主机能用 Memcached 吗?

大多数虚拟主机不支持,因为需要 SSH 权限安装服务和编译 PHP 扩展。但部分国外的 cPanel 主机提供 Memcached 服务,可以直接在面板里启用,具体咨询你的主机商确认。

开启缓存后后台登录状态会异常吗?

不会。WP Super Cache 等主流插件默认只对未登录用户启用页面缓存,登录用户和管理员看到的始终是实时页面,不会影响后台操作。

从一个具体问题开始

浏览 213 篇中文 WordPress 指南,找到可以立刻执行的答案。

浏览全部教程 →