WEB应用

WordPress启用memcached动态缓存以及报错解决

Jager · 5月2日 · 2016年 · · 10651次已读

张戈博客目前用的是Nginx的fastcgi缓存方案,属于纯净态缓存模式,所以前台登录态什么的基本都没了。如果要兼顾前台登录态,又想速度快,有没有解决方案?

之前在分享张戈博客优化方案时提到,要实现网站轻度缓存,方案还是有的,比如 DB Cache Reloaded、Redis、memcached等。

最近恰好遇到一个数据缓存需求,因此尝试了下memcached方案,下面简单分享下我的环境部署以及报错解决过程。WordPress启用memcached动态缓存以及报错解决

一、d还是不d

php有memcached和memcache两个类似组件,百度搜出来的文章,大部分是教你如何安装memcache(d),却步解释二者的区别。

比如这位博客仁兄的经验分享:WordPress启用memcached动态缓存以及报错解决

为什么他选第二个不行?其实php的这2个组件还是有点区别的:

简单来说:

memcache 是 pecl 扩展库版本,原生支持php,出现更早,是老前辈;

memcached 是 libmemcached 版本,出现较后,是新一代,因此也更加完善,推荐使用。

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

其实,我们这种小网站的话,二选一即可,这点QPS还不至于纠结。不过一旦选择了,安装的时候就要注意区分,一对一配套安装,别搞的牛头不对马嘴,出现上面那位仁兄的困惑(后文有相关说明)。

这里,我果断选择了带d的,继续分享。

二、部署memcached

1、安装memcached

Ps:这里的memcached是指Mencached的服务端,用来处理缓存数据,名字也是容易混淆。

下面2种安装方式任选其一:

①、在线安装

#Centos直接使用yum安装即可,其他系统自行搜索安装命令,比如ubuntu
yum -y install memcached

#启动memcached
service memcached start

#开机启动
chkconfig memcached on

②、编译安装

相比在线安装,很多时候编译安装更加灵活,非常类似Windows平台的自定义安装或绿色安装,推荐熟悉 Linux 系统的朋友使用:

#从官方下载最新源码包
wget http://memcached.org/files/memcached-1.4.25.tar.gz

#解压开始编译安装
tar xzvf memcached-1.4.15.tar.gz
cd memcached-1.4.15
./configure --prefix=/usr/local/memcached
make && make install
cd ..

#设置环境
ln -s /usr/local/memcached/bin/memcached /usr/bin/memcached
cp scripts/memcached.sysv /etc/init.d/memcached

#改为监听127.0.0.1,并关闭UDP连接方式,若为远程服务调用或不需要的话请跳过此行
sed -i 's/OPTIONS=""/OPTIONS="-l 127.0.0.1 -U 0"/g' /etc/init.d/memcached 

sed -i '[email protected]@#[email protected]' /etc/init.d/memcached
sed -i '[email protected]/var/run/memcached/[email protected]/var/run/[email protected]' /etc/init.d/memcached

#启动并设置开机服务
chmod +x /etc/init.d/memcached
service memcached start
chkconfig --add memcached
chkconfig memcached on

至此memcached的服务端就安装好了。

2、集成php-memcached拓展

①、先安装libmemcached

提前分享一个问题,如果直接按照网上的教程安装php-memcached可能会报如下错误:

configure: error: no, sasl.h is not available. Run configure with –disable-memcached-sasl to disable this check

大部分教程会使用 –disable-memcached-sasl 参数来禁用这个功能,作为一个强迫症,我还是从国外的论坛扒到了解决方法,很简单,在编译libmemcached之前,先安装cyrus-sasl-devel即可解决

yum install cyrus-sasl-devel

接着开始编译安装libmemcached:

wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar xzf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --with-memcached=/usr/local/memcached --prefix=/usr/local/libmemcached
make && make install
cd ..

②、安装php-memcached组件

下载和解压这步,我们要区分下是php7还是之前的版本:

I、如果当前环境是php7 :

#从github下载PHP7专用的memcached组件分支 
wget https://github.com/php-memcached-dev/php-memcached/archive/php7.zip
#解压备用
unzip php7.zip
cd php-memcached-php7

II、如果是旧的的php版本:

#从官方下载php-memcached的最新源码包
wget http://pecl.php.net/get/memcached-2.2.0.tgz

#解压和编译
tar zxvf memcached-2.2.0.tgz
cd memcached-2.2.0

接下来开始编译:

#注意已有php的实际路径
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install

编辑php.ini文件,在最后插入如下参数

extension=memcached.so

Ps:如果不知道php.ini在哪个位置 ? 执行命令:php –ini 即可找到。

保存后,执行如下命令看看是否加载成功:

php -m | grep memcached

如果输出memcached则表示成功。

最后,如果是Nginx就 service php-fpm reload ,如果是Apache就重启Apache完成安装。

③、测试缓存

<?php
$m = new Memcached();
$m->addServer( '127.0.0.1', 11211 );
$m->set( 'foo', 100 );
echo $m->get( 'foo' ) . "\n";

将上述代码保存为 test.php,然后执行 php -f test.php,如果能输出100表示安装成功。

三、WordPress缓存

做完上述所有步骤,系统环境就已经支持memcached缓存了。下面分享如何应用到WordPress

1、安装插件

访问github项目页面下载插件包:

https://github.com/tollmanz/wordpress-pecl-memcached-object-cache

下载并解压得到的 object-cache.php,上传到 wp-content 目录即可开启memcached缓存。

值得说明的是,这里还有一个大坑等着你来踩:

WordPress官网上的object-cache.php虽然也号称Memcached 插件,然而它只支持Memcache,不支持新版的,所以不能使用。如果错误地将object-cache.php和Memcached混用的话,则会出现WordPress打不开,前台后台页面一片空白的现象。

这也就是经常有站长反馈WordPress启用memcached功能后,页面空白的错误原因了。不巧,张戈在测试的时候也踩坑了,所以特别提出来,希望大家了解错误的原因,规避掉!

 

2、查看效果

做完第2步之后,你可以去网站前台刷新几次,产生缓存,然后从官方下载探针:

http://pecl.php.net/get/memcache-3.0.8.tgz

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

define('ADMIN_USERNAME','memcache');    // Admin Username
define('ADMIN_PASSWORD','password');    // Admin Password
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);

$MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array

修改如下:

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

上传到网站私密目录(临时测试可以放到根目录),然后通过前台访问memcache.php这个文件,输入上面的用户名和密码即可看到memcached状态:

WordPress启用memcached动态缓存以及报错解决

3、其他设置

如果发现页面可以打开,但是里面没有Hits数据,说明WordPress并没有成功连接到memcached,这时候我们可以在wp-config.php加入如下参数:

global $memcached_servers;
$memcached_servers = array(
    array(
        '127.0.0.1', // Memcached server IP address
         11211        // Memcached server port
    )
);

实际的memcached监听IP和端口,你可以通过如下命令查看:

netstat -nutlp | grep memcache

四、纯静态缓存

实际上memcached可以缓存动态查询数据,他也可以缓存html内容!因此,memcached也能实现和其他方案一样的html纯净态缓存!

实现原理和我之前分享的php代码缓存html方案类似,不过后者更好的是将缓存内容放在了内存当中,速度比放硬盘快的绝对不是一点点。

如何将前台页面html都缓存到memcached中呢?这里,我们需要用到 batcache 这款插件。

1、下载安装

直接在WordPress后台搜索安装 batcache ,也可以从官方下载插件包:

https://wordpress.org/plugins/batcache/

然后解压得到 advanced-cache.php 上传到wp-content即可。

2、启用缓存

在wp-config.php中启用缓存:

define('WP_CACHE', true);

不过,插件默认只会对游客缓存,显然也是怕影响到前台登录态。缓存和动态判断一直是矛与盾、鱼和熊掌,看个人抉择吧。

3、参数调整

var $max_age =  3600; // Expire batcache items aged this many seconds (zero to disable batcache)
var $remote  =    0; // Zero disables sending buffers to remote datacenters (req/sec is never sent)
var $times   =    2; // Only batcache a page after it is accessed this many times... (two or more)
var $seconds =  0; // ...in this many seconds (zero to ignore this and use batcache immediately)

max_age代表缓存过期时间(以秒为单位),times表示访问多少次才创建缓存(2是最小值),seconds表示在多少秒之后才创建缓存(0表示立即)。

我目前也只是要用到memcache的动态缓存,所以对于batcache也只是初步了解状态,感兴趣的朋友可以自行搜索学习更多相关设置。

83 条回应
  1. 小C博客2016-5-2 · 22:24

    我装的是redis,但我不会用。就一直在哪放到。等有时间试试memcached,感谢分享!!

  2. 晓庄2016-5-3 · 0:13

    一直没玩过类似的这些东西。
    只有在dz的时候,直接开启redis使用了。那个开启还是挺简单的

    • Jager2016-5-3 · 8:06

      redis搞起来会更简单一些

  3. 好文推荐2016-5-3 · 15:27

    前段时间弄了一下缓存、后面怎么突然打开速度觉得变慢了、可能内容太少的缘故吧

  4. 明月登楼2016-5-3 · 16:18

    至今还用的是虚拟主机,没有体验过Memcached呢!

    • 五四青年2016-5-4 · 17:26

      你的流量那么大、还在用虚机的啊

  5. 柒月网络2016-5-3 · 17:24

    指明了一些人的误区,我转载修改补充一些地方!

  6. aunsen2016-5-3 · 22:24

    以后要请Jager帮忙部署服务器环境了。
    我的站由于更新了WP4.51和鸟哥的最新主题,导致资源占用奇高,服务器都挂了,排除发现是xmlrpc的锅,修复了xmlrpc的问题后还是占用高,后来降级WP到4.4,主题也降到老版的1.8,可问题还是依旧,米办法现在只有搬到米国呆一阵子了,唉,想哭!

    • Jager2016-5-4 · 10:07

      被人攻击了吧

      • aunsen2016-5-4 · 13:38

        鬼知道啊,郁闷

        • Jager2016-5-5 · 14:00

          有空一起看看

  7. 牧羊人2016-5-4 · 7:59

    这玩儿好像很消耗内存。。。

    • Jager2016-5-4 · 10:07

      是的,所有数据都放到内存中,不过一般个人网站数据都不会太大,最多占用个1~200M吧,不算问题。

    • 煙云2016-5-5 · 1:12

      应该是可以指定缓存内存大小的。博主图片中已经显示,缓存内存64M

      • Jager2016-5-5 · 9:44

        /etc/init.d/memcached 这个文件开头有几行参数,里面可以定义内存占用的最大值 CACHESIZE=64

  8. 技术宅2016-5-5 · 11:20

    请问可以和nginx Fastcgi cache 一起用吗?

    • Jager2016-5-5 · 13:59

      使用上没冲突,但是没必要重复。用了之后,动态部分会快一些,比如WP后台。

  9. 刷百度手机下拉2016-5-6 · 16:09

    看来以后服务器有什么问题,要来求你帮忙指导了

  10. 孟子非博客2016-5-6 · 22:20

    不是程序猿有点看天书的感觉

  11. 跨境电商平台2016-5-6 · 23:04

    非常不错!!!!

  12. 诸葛博客2016-5-7 · 9:59

    顶一个签到成功!签到时间:上午9:58:49,每日签到,生活更精彩哦~

  13. 威客网2016-5-7 · 10:50

    技术文章支持下~

  14. 热腾网2016-5-7 · 23:56

    现在还是静态缓存吧?见到文章的浏览次数不变。

  15. 暗示法2016-5-8 · 15:36

    写的太复杂了,简单的东西复杂化。

    • Jager2016-5-8 · 17:59

      本人不才,那你分享一下复杂的东西简单化吧,让我也学习下。不留网址、IP用的小日本代理、邮箱还是错的,看来是不愿意交流咯?

  16. Qa2016-5-11 · 16:07

    这个天坑我服,还真不知道官网上的对象缓存插件还有这个坑。 ➡

  17. 玄烨轩2016-5-26 · 10:26

    感觉有点复杂,现在太复杂都找空间商帮忙

  18. 狂族晨曦2016-5-26 · 22:57

    学了Linux后,看教程终于不那么吃力了,但是还没实际操作过,继续努力!

  19. Seon2016-5-28 · 4:50

    memcached有研究过,在Apache和Nginx上都有撸过,个人感觉使用Apache时memcached缓存会比Nginx好一点,不知道是不是错觉。Redis之前研究过,后来搁置一边了,前些天又撸起来了,但是发现Redis有个问题就是前面的评论所填写的信息下一个访客会看到(老鬼有出过解决方案不过很久没折腾了忘记在哪里了)。。不知道能不能在你这边取到经 🙄

    • Jager2016-5-28 · 14:49

      评论信息和缓存本身就是鱼和熊掌的关系。
      我目前处理办法是去掉所有php中关于用户信息的代码
      改成cookie记录和填充方式。

      • Seon2016-5-29 · 7:15

        咦?分享一下你的处理方法吧 😆

          • 后知后觉2016-5-31 · 15:01

            鸟哥最新的主题不好处理登陆状态,总有些页面残留着上一个人的信息,Jager大大能帮忙看下吗 🙁

            • Jager2016-5-31 · 21:07

              前台审查元素分析出现登录信息的关键词,然后全局代码搜索下关键词出现的主题php文件,然后改掉就好了。

  20. SEO学习群1925099902016-6-4 · 15:44

    签到成功!签到时间:下午3:43:55,一起交流学习,进群有干货分享哦

  21. SEO学习群1925099902016-6-4 · 17:06

    分享一下

  22. 海外敗2016-6-8 · 22:48

    感谢博主分享

  23. magicboy80402016-6-14 · 19:38

    今天尝试了一把,因为是kangle服务器源码,在PHP.INI最后一行添加extension=memcached.so报错如下:

    • Jager2016-6-16 · 13:38

      发邮件吧,貌似代码没上传成功。

  24. magicboy80402016-6-14 · 19:39

    报错如下

  25. 软件海2016-6-20 · 20:43

    我在WP官网上看,mencached插件是2月前才更新的,但是github上显示的是2年前更新的,为什么你要说WP官网上的是旧版本?

    • 软件海2016-6-20 · 20:47

      我这边启用了mencached缓存之后,之前注册的用户全部无法登录了,必须要重新修改一下密码才可以登录,好在刚开启的登录功能,只有五个用户,简单通知一下就行了,问题不大。但是奇怪的是,我用管理员的帐号登录就没有任何问题。
      mencached缓存是在内存中存储的,那如果机器重启了,或者手动刷新了mencached缓存,不会又出现所有用户无法登录的情况吧~

      • Jager2016-6-20 · 22:33

        memcache不应该会出现这种情况吧,确保使用了wordpress配套的memcached插件

        • 软件海2016-6-21 · 9:26

          我是在wordpess官网上下载的memcached插件。昨天也在其它博客里看到你说的这个坑,我还是把wordpress官网那个插件删了吧。

    • Jager2016-6-20 · 22:32

      不是你理解的旧版本,而是基于C的memcached比php原生的memcache更新,性能也更好一些。

  26. 李东辉博客2016-6-22 · 15:46

    学习了。都是技术性文章,收藏,

  27. 嗯view2016-6-23 · 23:25

    wordpress +memcached 明智之选

  28. 刘传鹏博客2016-6-25 · 15:09

    我的博客就是wordpress+memcached的,,不过我是Windows2008的

    • Jager2016-6-25 · 15:34

      厉害,你博客速度很快。

  29. 大蚂蚁2016-7-12 · 23:36

    好吧,我是个纯小白,问下网站私密目录是哪里?还有我的missing好高呀,69%,这个可以调整吗?网站还是个测试站点。作为一个纯小白,我想说zhang.ge,为我指明了很多次方向。谢谢。

    • Jager2016-7-13 · 6:33

      私密目录就是只有你自己知道的目录。。。搞不清楚就放根目录。

  30. Qa2016-7-20 · 17:43

    用了博主提供的那个版本的object-cache.php ,错误导致网站500!
    PHP Fatal error: Maximum execution time of 5 seconds exceeded in /data/wwwroot/acg18/wp-content/object-cache.php on line 900

    • Jager2016-7-21 · 13:08

      用错版本了吧,这个是memcached

      • Qa2016-7-21 · 23:27

        没,大部分时间正常…但是一抽风及完蛋。重启啥都没用了只能删了这文件。

        • Jager2016-7-22 · 7:42

          memcached没做开机启动吧?重启系统就没了

          • Qa2016-7-22 · 22:14

            这种错误就不会犯了。
            挺奇葩的问题,就问下看看有没有也遇到过的。

            • Jager2016-7-23 · 21:06

              没遇到过哦

  31. 小舞2016-8-5 · 20:37

    super cache+memcached应该好用吧,老是感觉super cache对apache有好

  32. 李光春2016-12-6 · 16:27

    我也搞了这个 :mrgreen:

  33. 小舞2016-12-12 · 16:27

    这个同一个服务器下几个站点用这个会出错,config那边需要更改下,希望也更新下

    • Jager2016-12-12 · 20:25

      具体是?

      • 小舞2016-12-16 · 14:11

        因为同一个服务器下有几个站点,如果A站点启用memcache的话,B启用就会空白,后台访问b就会跳转到A去

        • Jager2016-12-17 · 9:48

          估计是缓存的key设置不够精细,导致无法区分站点。。

  34. 惜时2017-2-15 · 11:45

    看了博主的教程,缓存成功!不过我的网站每天都有更新,由于缓存,有些地方数据不更新,比如文章归档页,,,怎么修改缓存时间 ❓ 还是有什么更好的方法!

  35. Ashin2017-6-19 · 9:11

    感谢,先试试效果~!

  36. iiong2017-7-17 · 13:33

    我目前开启了fastcgi_cache缓存, memcached缓存动态查询数据,请问batcache这个还需要安装吗?
    batcache与fastcgi cache两者哪个更好些,谢谢啦!

  37. 宅男猫2017-9-17 · 11:39

    认真看了一遍感觉非常详细,我站的memcached的问题就是在你和水煮鱼的博客之间来回看搞定的。
    那会儿还以为你这只是一个无名小站,虽然收藏了这篇但是并没有太过于关注。。。后来朋友推荐说Jager的博客超牛逼的。。。我回过神来才知道是大神~~万分感谢为我们这些不懂得人,提供认真看能看懂的文章。拜谢

    • Jager2017-10-25 · 12:37

      客气了~

  38. 哈卡2017-10-25 · 9:16

    fastcgi 和 memcached 缓存mhtml页面用哪个好呀?
    貌似Memcached不能根据需要,比如更新文章等自动清除缓存。

    • Jager2017-10-25 · 12:38

      memcached可以用batcache 插件来解决缓存清理问题

  39. boyizmen2017-11-20 · 15:55

    启用batcache插件后前端页面直接崩了,博主知道什么原因吗?
    打字这特效看的眼睛花。。。 🙁

  40. lemon2017-12-22 · 22:48

    你好,之前用的W3 total cache 里的 memcached 缓存 也缓存成功了,今天升级了PHP版本,然后W3TC 就连不上memcached 了,请问大神知道怎么解决或者排除故障么?

    The following memcached servers are not responding or not running:
    Database Cache: 127.0.0.1:11211.
    Object Cache: 127.0.0.1:11211.
    Page Cache: 127.0.0.1:11211.
    Minify: 127.0.0.1:11211.
    This message will automatically disappear once the issue is resolved.
    • Jager2018-1-30 · 13:08

      登陆服务器检查11211端口是否存在,看起来是memcached服务挂了

  41. 张尧博客2018-4-23 · 1:13

    发现有人抄袭博主这篇文章:
    http://www.daniao.org/2280.html

  42. 张尧博客2018-4-23 · 1:13

    发现有人抄袭博主这篇文章:http://www.daniao.org/2280.html

  43. 绿茶2018-7-21 · 4:42

    按步骤操作,一直操作到编译php.ini前面的那个步骤时候,出现报错,就是在安装php-memcached组件的时候的最后一个
    make && make install 的时候,报make: *** No targets specified and no makefile found. Stop这个错误

  44. CE安全网2018-8-1 · 19:10

    advanced-cache.php
    高级缓存插件。 未启用: 需要在wp-config.php文件中包含define(‘WP_CACHE’, true);。

  45. CE安全网2018-8-1 · 19:11

    大家有遇到这样的情况吗? config文件已经加上了 define(‘WP_CACHE’, true); 后台插件还是显示未启用

  46. 魏艾斯博客2018-8-11 · 20:37

    我的服务器上了memcached,opcache和batcached,现在有个问题就是首页置顶第一篇文章,本身编辑的时候是取消了置顶的,但游客访问的时候还依然是置顶状态,这是为什么?如何能解决呢?

    • 魏艾斯博客2018-8-11 · 21:48

      自己搞定了,不修改直接上传源文件就没这个问题了。

  47. 无心2018-8-14 · 11:26

    请问使用了memcached缓存,还有必要使用CDN加速吗?如果2个一起用有冲突吗

  48. E语云博客2019-2-23 · 12:05

    如果用了CDN加速,这个教程就没必要了吧?

  49. 张鑫2019-3-12 · 22:05

    本文中 object-cache.php和advanced-cache.php可以一起用吧