导读:正好手头有一个需求就是需要轻度的数据缓存,因此尝试了一把 memcached,简单分享下部署过程及遇到的报错和解决。一、 d 还是不 d 说到 php 的 memc...

正好手头有一个需求就是需要轻度的数据缓存,因此尝试了一把 memcached,简单分享下部署过程及遇到的报错和解决。

一、 d 还是不 d

说到 php 的 memcached 和 memcache 组件,百度一搜都会教你如何安装 memcache(d),然后很多人就照着做,做到最后发现不对,试了半天虽然搞定了,但还是不知道到底有 d 还是没有 d,比如这位博客仁兄的经验分享:

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

简单来说:

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

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

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

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

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

二、部署 memcached

1 、安装 memcached

Ps:说到这里又杀出一个容易混淆的程咬金。这里要安装的 memcached 是指 Mencached 的服务端,用来处理缓存数据。

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

①、在线安装

  1. #Centos 直接使用 yum 安装即可,其他系统自行搜索安装命令,比如 ubuntu 
  2. yum -y install memcached 
  3.  
  4. #启动 memcached 
  5. service memcached start 
  6.  
  7. #开机启动 
  8. chkconfig memcached on 

②、编译安装

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

  1. #从官方下载最新源码包 
  2. wget http: 
  3.  
  4. #解压开始编译安装 
  5. tar xzvf memcached-1.4.15.tar.gz 
  6. cd memcached-1.4.15 
  7. ./configure --prefix=/usr/local/memcached 
  8. make && make install 
  9. cd .. 
  10.  
  11. #设置环境 
  12. ln -s /usr/local/memcached/bin/memcached /usr/bin/memcached 
  13. cp scripts/memcached.sysv /etc/init.d/memcached 
  14.  
  15. #改为监听 127.0.0.1,并关闭 UDP 连接方式,若为远程服务调用或不需要的话请跳过此行 
  16. sed -i 's/OPTIONS=""/OPTIONS="-l 127.0.0.1 -U 0"/g' /etc/init.d/memcached 
  17.  
  18. sed -i 's@chown@#chown@' /etc/init.d/memcached 
  19. sed -i 's@/var/run/memcached/memcached.pid@/var/run/memcached.pid@' /etc/init.d/memcached 
  20.  
  21. #启动并设置开机服务 
  22. chmod +x /etc/init.d/memcached 
  23. service memcached start 
  24. chkconfig --add memcached 
  25. 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

先看看 SASL 是什么?

SASL 全称 Simple Authentication and Security Layer,是一种用来扩充 C/S 模式验证能力的机制。
简单来说 SASL 是一个胶合 (glue) 库,通过这个库把应用层与形式多样的认证系统整合在一起。这有点类似于 PAM,但是后者是认证方式,决定什么人可以访问什么服务,而 SASL 是认证过程,侧重于信任建立过程,这个过程可以调用 PAM 来建立信任关系。在这里 Memcached 就是上面提到的应用层,具体的认证交给 SASL 库,SASL 会根据相应的认证机制来完成验证功能。

果然,一般也用不到,所以大部分教程都是使用错误提示中的 --disable-memcached-sasl 来禁用张戈功能,作为一个强迫症,我还是从国外的论坛扒到了解决方法,很简单,在编译 libmemcached 之前,先安装 cyrus-sasl-devel 即可解决

  1. yum install cyrus-sasl-devel 

接着开始编译安装 libmemcached:

  1. wget https: 
  2. tar xzf libmemcached-1.0.18.tar.gz 
  3. cd libmemcached-1.0.18 
  4. ./configure --with-memcached=/usr/local/memcached --prefix=/usr/local/libmemcached 
  5. make && make install 
  6. cd .. 

②、安装 php-memcached 组件

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

I 、如果当前环境是 php7 :

  1. #从 github 下载 PHP7 专用的 memcached 组件分支 
  2. wget https: 
  3. #解压备用 
  4. unzip php7.zip 
  5. cd php-memcached-php7 

II 、如果是之前的 php 版本:

  1. #从官方下载 php-memcached 的最新源码包 
  2. wget http: 
  3.  
  4. #解压和编译 
  5. tar zxvf memcached-2.2.0.tgz 
  6. cd memcached-2.2.0 

接下来开始编译:

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

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

  1. extension=memcached.so 

Ps:找不到 php.ini ? 很简单执行命令:php --ini 即可找到,不信你试试。

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

  1. php -m | grep memcached 

如果输出 memcached 则表示成功。

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

③、测试缓存

  1. <?php 
  2. $m = new Memcached(); 
  3. $m->addServer( '127.0.0.1', 11211 ); 
  4. $m->set( 'foo', 100 ); 
  5. echo $m->get( 'foo' ) . "
    "

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

三、 WordPress 缓存

做完上述所有步骤,还只能说明系统环境已经支持了 memcached 缓存。下面我们还要将这个缓存用起来才行。

1 、埋坑警报

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

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

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

2 、安装插件

所以,如果你一开始选择的是不带 d 的 memcache,那么直接用 WordPress 官方的 object-cache.php 插件即可!如果你选择的是带 d 的 memcached,那么这里就不能用官方的插件,而是要用 github 版本:

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

在这里下载并解压得到的 object-cache.php,上传到 wp-content 目录即可开启 memcached 缓存。当然,不管是带 d 的还是不带 d 的,记得都是上传到 wp-content 目录。

3 、查看效果

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

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

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

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

修改如下:

  1. define('ADMIN_USERNAME','memcache');     
  2. define('ADMIN_PASSWORD','password');     
  3. define('DATE_FORMAT','Y/m/d H:i:s'); 
  4. define('GRAPH_SIZE',200); 
  5. define('MAX_ITEM_DUMP',50); 
  6.  
  7. $MEMCACHE_SERVERS[] = '127.0.0.1:11211' 
  8.  

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

4 、更多设置

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

  1. global $memcached_servers
  2. $memcached_servers = array
  3.     array
  4.         '127.0.0.1' 
  5.          11211         
  6.     ) 
  7. ); 

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

  1. 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 中启用缓存:

  1. define('WP_CACHE', true); 

3 、参数调整

  1. var $max_age =  3600;  
  2. var $remote  =    0;  
  3. var $times   =    2;  
  4. var $seconds =  0;  

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

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

来源:http://zhangge.net/5097.html