WordPress启用memcached动态缓存以及报错解决
张戈博客目前用的是Nginx 的 fastcgi 缓存方案,属于纯净态缓存模式,所以前台登录态什么的基本都没了。如果要兼顾前台登录态,又想速度快,有没有解决方案?
之前在分享张戈博客优化方案时提到,要实现网站轻度缓存,方案还是有的,比如 DB Cache Reloaded、Redis、memcached 等。
最近恰好遇到一个数据缓存需求,因此尝试了下 memcached 方案,下面简单分享下我的环境部署以及报错解决过程。
一、d 还是不 d
php 有 memcached 和 memcache 两个类似组件,百度搜出来的文章,大部分是教你如何安装 memcache(d),却步解释二者的区别。
比如这位博客仁兄的经验分享:
为什么他选第二个不行?其实 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 's@chown@#chown@' /etc/init.d/memcached
sed -i 's@/var/run/memcached/memcached.pid@/var/run/memcached.pid@' /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 状态:
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 也只是初步了解状态,感兴趣的朋友可以自行搜索学习更多相关设置。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 日常工作中的设计:解耦和封装
- 详解Gson的TypeToken原理
- 时间序列分解和异常检测方法应用案例
- 为什么机器学习应用交易那么难(上)
- 快速学习-sentinel动态规则扩展
- Git-git diff命令结果解析
- 快速学习-sentinel实时监控
- Git技术干货!工作中Git的使用实践和常用命令合集!
- gremlin-both()与bothE().bothV()的区别
- C# Time.deltaTime 增量时间
- Docker--docker ps 命令与结果解析
- Junit5系列-Junit5中@DisplayName自定义名称
- Junit5系列-Junit5中Assertions断言类
- 使用libev监视文件夹下文件(夹)属性变动的方案和实现
- C++拾取——stl标准库中集合交集、并集、差集、对称差方法