使用 Memcached 内存缓存来实现 WordPress 站点秒开
很多人问我 WordPress 怎么速度快或者甚至实现秒开,我的一般简单的回答就是装 Memcached,这真的不是敷衍了事,一点不夸张,装上 Memcached 就可以让 WordPress 快上好几倍,但是真正用好 Memcached,还是需要对 WordPress 有更深的了解。
所以我把我博客关于 Memcached 的所有文章重新整理一下,做个专题深度优化 WordPress 的合集,让大家真正理解 WordPress 优化。

什么是 Memcached?
Memcached 是一款高性能的分布式内存对象缓存系统,专为加速动态应用设计,它既能提高访问的速度,同时还减低了数据库的负载。

Memcached 可以存储来自调用数据库和 API,或者页面渲染生成的任意类型的数据(字符串,对象)到内存中,也可以直接到内存中去读取。它的 API 支持目前大部分流行的编程语言,Memcached 的官方网站:http://memcached.org/
最初 Danga Interactive 为提升 LiveJournal.com 的速度而研发了 Memcached,目前,最终实现了每天已经在向一百万用户提供多达两千万次的页面访问,而这些,是由一个由 Web 服务器和数据库服务器组成的集群完成的。
Memcached 的 PHP 扩展
PHP 有两个 Memcached 扩展:“PHP Memcache 扩展” 和 “PHP Memcached 扩展”,这就是是我们搞混的地方。
PHP Memcache 扩展用 PHP 实现的,支持面向对象和面向过程两种接口,2004年就实现了,是老的扩展,而且功能少,属性也可设置的少。
PHP Memcached 扩展基于 libmemcached 开发的,使用 libmemcached 库提供的 API 与 Memcached 服务进行交互,2009年实现,Memcached 扩展功能更加完善,支持的函数更多,比如支持批量操作,现在一般建议使用 Memcached 扩展。
下面是一个支持功能对照列表:
对比项 | Memcache | Memcached |
---|---|---|
发布日期 | 2004-06-08 | 2009-01-29 (beta) |
仍在维护? | Yes | Yes |
第三方依赖 | None | libmemcached |
Key自动修复 | Yes | No |
Append/Prepend | No | Yes |
自动序列化 | Yes | Yes |
二进制协议 | No | Optional |
CAS | No | Yes |
压缩 | Yes | Yes |
超时设置 | Connect Only | Various Options |
一致性哈希 | Yes | Yes |
延迟Get | No | Yes |
Multi-Get | Yes | Yes |
Session支持 | Yes | Yes |
指定Server get/set | No | Yes |
数字存储 | Converted to Strings | Yes |
支持长连接? | Yes | Yes |
Memcached 可以极大提高效率
因为 WordPress 默认支持对象缓存(Object Cache),它是把从数据库取到数据作为对象放到缓存中,默认情况下是储存在当前 PHP 运行线程中,这样只是解决了在同线程下不再重复相同的从数据库获取数据,但是下次同样的请求,数据库的请求还是会再次请求。
所以在 WordPress 实现 Memcached,其真正的意思是使用内存而非线程来充当 WordPress 对象缓存的存储介质,这样下次访问的时候就直接从内存中读取,这样相比就有很大的速度优势,速度自然快很多。

上图是我爱水煮鱼使用 Memcached 之后的缓存对象的命中率,可以看出命中率是非常高,接近 99%,基本上可以保证所有数据都是从内存中取,所以使用 Memcached 进行缓存是非常有效的。
WordPress 如何启用 Memcached
首先需要明确一点,必须同时安装 Memcached 服务端和其 PHP 扩展。
如果安装了 Memcached 服务端不安装扩展,那么 PHP 无法操控 Memcached。同样如果安装了 PHP Memcached 扩展,但是没有安装 Memcached 服务端,那么这个就无法使用。
1. 首先服务器需要安装 Memcached 服务端,然后 PHP 需要安装上 Memcached 的扩展,再次注意 PHP 有两个扩展:PHP Memcache 扩展 和 PHP Memcached 扩展,两者仅仅相差一个字母 D,你可以通过 phpinfo()
这个 PHP 函数来查看到底安装的是哪个扩展,一定要使用 PHP Memcached 扩展。
// 安装 Memcached 服务
sudo apt-get install memcached
sudo systemctl start memcached
// 安装 PHP Memcached 扩展
sudo apt-get install php-memcached
2. WPJAM Basic 插件已经集成 Memcached 的功能,将 wpjam-basic/template/
目录下的 object-cache.php
文件复制到 wp-content
目录下,注意不是 wp-content/plugins/
。
3. WordPress 会自动检查在 wp-content
目录下是否有 object-cache.php
文件,如果有,直接调用它作为 WordPress 对象缓存机制。
4. 安装成功之后,WPJAM Basic 会自动在 WordPress > WPJAM 菜单下的的「系统信息」 下看到 Memcached 的信息,这个也可以判断你的 WordPress 是否已经正确安装 WordPress 的方法。

简单总结
WordPresss 的缓存机制是对象缓存(Object Cache),它是把从数据库取到数据作为对象放到缓存中,默认情况下,WordPress 的对象缓存储存在当前 PHP 运行线程中,这样相同的数据库请求,在同线程下不再请求数据库,WordPresss 据此来优化效率。但是下次重复的访问或者不同线程请求,WordPress 还是会重复到数据库取数据,并没有真正从根本上解决效率的问题。
而 WordPress 使用 Memcache 之后,则把对象缓存的存储介质替换成了内存,这样下次相同请求或者不同线程的请求,直接从内存中获取数据,不再从数据库获取数据,这样简单的缓存的存储介质的替换就大大增强了 WordPress 效率,一些实现 0 SQL 的站点,可以在毫秒级就打开页面,比如我的博客。😁
WPJAM Basic 插件已经集成了 Memcached,下载 WPJAM Basic 之后,将 wpjam-basic/template/
目录下的 object-cache.php
文件复制到 wp-content
目录下即可。