Alien的博客

PHP7中添加memcached模块


#首先按照必要库
yum  install autoconf  cyrus-sasl-plain cyrus-sasl cyrus-sasl-devel cyrus-sasl-lib -y 
#指定php路径,以及编译线程数
phpdir="/var/local/php7.1.2"
cpunum=4

#先编译libmemcached,在php7中建议使用1.0.18以上的版本
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz  &&\
tar xvf libmemcached-1.0.18.tar.gz && \
cd libmemcached-1.0.18 && \
./configure --prefix=/var/local/libmemcached-1.0.18 --enable-sasl  &&\
make clean &&\
make -j $cpunum &&\
make install &&\
echo alien &&\
cd ..


#然后编译memcached
#在php7和之前版本的php所使用的版本是不同的
#支持php7 memcached的github地址
# https://github.com/php-memcached-dev/php-memcached.git

#直接使用最新的Releases版编译
wget  https://github.com/php-memcached-dev/php-memcached/archive/v3.0.2.tar.gz -O php-memcached-3.0.2.tar.gz && \
tar xvf php-memcached-3.0.2.tar.gz && \
cd php-memcached-3.0.2 && \
$phpdir/bin/phpize && \
./configure --with-libmemcached-dir=/var/local/libmemcached-1.0.18 --enable-memcached-sasl  --with-php-config=$phpdir/bin/php-config && \
make clean && \
make -j $cpunum && \
make install && \
echo alien


#在php.ini中添加memcached模块
echo "extension=memcached.so" >>$phpdir/lib/php.ini
echo "memcached.use_sasl = 1"  >>$phpdir/lib/php.ini

#检查模块是否加载成功
$phpdir/bin/php  -i |grep sasl 
$phpdir/bin/php  -i |grep "memcached support => enabled"

之前在编译memcached的过程中提示


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


查了好多资料都说要加禁用sasl的参数才行,可是我的环境中是必须要用到sasl的,找了好久终于找到原因,少装了sasl的库,按照我上面的步骤装就没问题啦,部署后的环境可以完美连接阿里云的Memcache
另外附上php测试Memcache的示例,代码来自于阿里云


<?php
$connect = new Memcached;  //声明一个新的memcached链接
$connect->setOption(Memcached::OPT_COMPRESSION, false); //关闭压缩功能
$connect->setOption(Memcached::OPT_BINARY_PROTOCOL, true); //使用binary二进制协议
$connect->setOption(Memcached::OPT_TCP_NODELAY, true); //重要,php memcached有个bug,当get的值不存在,有固定40ms延迟,开启这个参数,可以避免这个bug
$connect->addServer('aaaaaaaaaa.m.yyyyyyyyyyy.ocs.aliyuncs.com', 11211); //添加OCS实例地址及端口号
$connect->setSaslAuthData('aaaaaaaaaa', 'password'); //设置OCS帐号密码进行鉴权,如已开启免密码功能,则无需此步骤
$connect->set("hello", "world");
echo 'hello: ',$connect->get("hello");
$connect->quit();
?>