WP Super Cache 和 W3 Total Cache 缓存插件使用 memcached 提升性能

WP Super Cache 和 W3 Total Cache 缓存插件使用 memcached 提升性能

说起 WP Super Cache 和 W3 Total Cache 这两个大名鼎鼎的 WordPress 缓存插件,很多博客站长们应该是都很熟悉的吧!明月也是 WP Super Cache 和 W3 Total Cache 插件的老用户了,可以说N年前就使用过的,但因为各种因素最后都放弃了,甚至去年都是使用 WP-Rocket 插件来替代的。至于说WP Super Cache 和 W3 Total Cache 插件当时放弃的原因主要还是“稳定性”太差这个原因的,但是现在回忆细想一下这个“稳定性”其实跟服务器权限是有很大的关系的。

因为 WP Super Cache 和 W3 Total Cache 实在是太强大了,强大到需要服务器的一些具体配置。而以前因为使用的是“虚拟主机”,在一些“权限”上还是有很多限制的,所以就造成运行时间久了以后就会出现各种“不稳定”问题了,记得当时最受不了的就是百度蜘蛛抓取一直返回503错误的问题很让我“抓狂”呀。最近正好在VPS上针对 WP Super Cache 和 W3 Total Cache 进行了分别的安装和调试,两个插件根据站点流量需求分别用在不同的站点上。

从 WP Super Cache 和 W3 Total Cache 两个插件的原理和性能上来说, WP Super Cache 比较适合日IP在1000以内的站点使用,因为并发流量过高的情况下使用 WP Super Cache 会造成主机负载压力,并且有时候这个负载压力还是蛮大的,当然如果服务器主机硬件配置高大上,这个负载压力是可以忽略不计的。

而 W3 Total Cache 的缓存性能相对于 WP Super Cache 来说提升很明显,同时对并发流量过高的承受度还是可以接受的,所以配合适合的服务器硬件配置主机还是个很不错的“高性价比” WordPress 缓存方案的,这里所说的服务器硬件配置主要是指CPU、内存这两个指标的哦。

关于 WP Super Cache 和 W3 Total Cache 插件的具体配置我就不再多说了,因为网上实在是太多类似的文章了(当然大部分都是“千篇一律”的拾人牙慧而已),大家可以随便百度一下了解了,今天主要讲讲 WP Super Cache 和 W3 Total Cache 插件使用服务器端的 memcached 来提升缓存性能。、



memcached 是什么?

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。

主要特征

  • memcached作为高速运行的分布式缓存服务器,具有以下的特点。
  • 协议简单
  • 基于libevent的事件处理
  • 内置内存存储方式
  • memcached不互相通信的分布式

关于 memcached 其实说白了,就是 PHP 的一个内存加速器, memcached 会把需要 PHP 运行的代码直接放在服务器内存里来加快运行效率,相应的 WP Super Cache 和 W3 Total Cache 使用 memcached 也就是把一些重要的缓存放到内存里加快了客户端请求的载入时间也就变相的提升了网页的载入速度以及缓存插件的执行效能。



PHP 有 memcached 和 memcache 两个类似组件,百度搜出来的文章,大部分是教你如何安装memcache(d),却不解释二者的区别。如上图所示在LNMP里添加 memcached 模块的时候会提示选择 memcache 还是 memcahed 的。

简单来说:

  • memcache 是 pecl 扩展库版本,原生支持php,出现更早,是老前辈;
  • memcached 是 libmemcached 版本,出现较后,是新一代,因此也更加完善,推荐使用。

Ps:如果想更深入了解,可以搜索下 memcache vs memcached

关于服务器端具体的部署 memcached 我就不多赘述了,在军哥 LNMP 环境下只需要运行 ./addons.sh install memcached 来自动编译安装即可了,很方便的,其他生产环境自行百度吧。

在 WordPress 里要启用 memcached 的支持需要一个 object-cache.php ,上传到 wp-content目录,这里百度上很多的教程上提供的 object-cache.php 下载链接都是 memcache 的,在 memcached 下使用会出现访问“500错误”的,所以一定要确认自己是 memcached 还是 memcache , memcached 的 object-cache.php 可以在 GitHub 获取到如:https://github.com/tollmanz/wordpress-pecl-memcached-object-cache 这里下载上传即可。(这里要感谢【张戈博客】的文章【WordPress启用memcached动态缓存以及报错解决】一文里的分享,让我走了很少的弯路。)

完成上述的服务器端的配置后,就可以在 WP Super Cache 和 W3 Total Cache 插件配置里启用 memcached 的支持了,不过为了让 WordPress 准确的找到 memcached 的 IP 和端口最好还是要在 wp-config.php 里添加上 memcached 的具体信息的,具体放置位置以文件开头为宜,如下:


  1. global $memcached_servers;
  2. $memcached_servers = array(
  3. array(
  4. 'IP地址(默认:127.0.0.1)', // Memcached server IP address
  5. 端口号(默认:11211) // Memcached server port
  6. )
  7. );


记得核对好代码里的IP地址和端口号与服务器端 memcached 的一定要一直哦。

WP Super Cache 中开启对 memcached 的支持

这里以 WP Super Cache 目前最新版1.5.3版本为例(百度里的很多类似教程都无视了版本号差异,真的有很大的差异的), WP Super Cache 的 memcached 支持目前还在“内测”阶段的,所以用“Simple”方式缓存的是无法使用 memcached 的,所以需要切换 WP Super Cache 缓存模式为“Expert”,这样才可以在下面的“高级”里面看到“使用对象缓存系统来存储缓存文件。 (实验室功能)”这个选择项目开关。如下图:



选择这个开关为开启后,点击下面的“更新”,然后清除 WP Super Cache 缓存,这时候在 WP Super Cache 的“内容”里就可以看到 memcached 对象缓存已经生效了所以不显示缓存列表了。如下图:



这是细心的站长们应该发现了 WP Super Cache 提示“Mod rewrite 模块可能未安装!”(如下图所示),这个好像是 WP Super Cache 默认仅支持 Apache 造成的,使用 Nginx 的话一定会看到这个提示的,但是经过明月的测试,发现是没有任何的影响的,基本可以暂时无视,当然网上也有很多这个问题的rewrite 配置大家可以自行百度参考设置,反正我是没有设置的,目前看运行良好。



更新

可以通过在 function.php 里添加下面的代码来屏蔽 WP Super Cache 里这个提示的:


  1. //禁止 WP Super Cache 显示“Mod rewrite 模块可能未安装!”
  2. add_filter('got_rewrite', 'nginx_has_rewrites');
  3. function nginx_has_rewrites() {
  4. return true;
  5. }


W3 Total Cache 中开启对 memcached 的支持

相对于 WP Super Cache 来看 W3 Total Cache 对 memcached 的支持可以说是大幅的提升了,因为在 W3 Total Cache 里 Page cache 、 Minify 、 Database Cache 、 Object Cache 、Fragment Cache 都可以支持 memcached 。从这点上来说 W3 Total Cache 相对于 WP Super Cache 来说档次提升了不少,我是蛮喜欢的。 W3 Total Cache 里开启 memcached 的支持可以说是很简单了,只要在 General Setings 里上述的模块了选择 memcached 并保存就可以了,在前端输出的 HTML 源码里可以看到如下图:



每种缓存模块结尾都注明了“using memcached”即表示已经成功了。

memcached 探针(实时状态监控)的使用

为了更好的获取 memcached 的运行状态,大家还可以使用 http://pecl.php.net/get/memcache-3.0.8.tgz 里提供的 memcache.php 来实现,安装很简单,只需要将这个 PHP 文件放到一个你知道的目录,然后在浏览器里调用即可,并且此文件还支持账号、密码设定只有你自己可以查看的。

解压后,里面有一个 memcache.php 文件,编辑并找到如下代码:


  1. define('ADMIN_USERNAME','memcache'); // Admin Username
  2. define('ADMIN_PASSWORD','password'); // Admin Password
  3. define('DATE_FORMAT','Y/m/d H:i:s');
  4. define('GRAPH_SIZE',200);
  5. define('MAX_ITEM_DUMP',50);
  6. $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
  7. $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array


修改如下:


  1. define('ADMIN_USERNAME','memcache'); // Admin Username 登录名称,自行修改
  2. define('ADMIN_PASSWORD','password'); // Admin Password 登录密码,自行修改
  3. define('DATE_FORMAT','Y/m/d H:i:s');
  4. define('GRAPH_SIZE',200);
  5. define('MAX_ITEM_DUMP',50);
  6. //下面是定义memcached服务器,一般我们是单机部署,所以注释掉一行,并将服务器地址根据实际修改,比如本文是127.0.0.1
  7. $MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
  8. //$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array


然后输入指向这个文件的网址链接在浏览器里输入账号和密码后就可以看到如下图所示的 memcached的运行状态了,话说 Hits 命中率还是很高的嘛!



最后一个小提示, memcached 默认内存使用的是 64MB 的,如果你感觉有点儿不够用,在 LNMP 环境下可以修改 /etc/init.d/memcached 文件里的参数来增加内存量的。修改完成记得要重启一下 memcached 哦!

目前,明月两个站点根据情况分别用着 WP Super Cache 和 W3 Total Cache ,至少目前来看还是很稳定的,载入速度也是很满意的,先测试运行几天看看具体的实测效果,当然在开启了静态化缓存后,必不可少的 CDN 也是要有的,至于为啥还要用 CDN ,老站长们都懂的,谁让我们活在一个“黑暗森林法则”的互联网世界里呢。

更新追加:

在服务器端部署 Memcached 的时候一定要针对一个站点运行一个 Memcached 进程,如果有绑定的内网IP就用内网IP作为 Memcached 的IP来使用(使用127.0.0.1还是有一些安全隐患的),这样安全性上提升很大,甚至可以限定只有主机IP才可以访问 Memcached 的端口这样最好。理论上 Redis 也可以这样来使用的,有空了再试试 W3 Total Cache + Redis 的组合,可惜 WP Super Cache 好像不支持 Redis ,好尴尬呀!

发布于 2017-09-01

文章被以下专栏收录

    凭着十年的网站建设运营经验(www.ymanz.com,www.imydl.com,www.imydl.tech,eat.ymanz.com),明月登楼站长专门开始【知乎专栏】分享多年以来在“网站建设”、“网站运营”等方面的经验技巧,同时还会分享在草根博客站长之路上的心路历程的心得等等。