一、了解概念
关于 memcached 和 php ,有好多个名词,因为长得非常相似,时常让人看的一脸懵逼,所以要先搞清楚。
1. memcached
指服务端,就像 mysql server、redis server 那样,你可以手动编译这玩意安装到服务器当做服务端用,也可以直接使用云服务商提供的现成的服务端。
2.libmemcached
一个客户端库,有了服务端,就要有客户端来连接、读写。客户端可以是 php、java、pyton、nodejs 等等语言,各个语言可以按照 memcached 的通信协议去实现,但这有点浪费了,libmemcached 就是一个封装好协议的库,各客户端可以在这个库基础上写 wrapper ,实现各自语言的api。这个库可以单独在 unix 系统中安装,各语言可以共享这个库。
3.php-memcache
php 早期实现的一个 memcached 客户端,自己内部实现了通信协议,不依赖 libmemcached
4.php-memcached
php 使用 libmemcached 实现的客户端 wrapper,封装好后暴露各种 api 给 php 用
二、安装哪个php扩展
可以看出有两个可供选择,php-memcached 或者 php-memcache,来个简单的对比
指标
php-memcache
php-memcached
依赖
无
libmemcached
功能
略少(够用)
丰富
维护
最后更新(2013年)
持续
支持
unix 和 win(已提供dll)
unix 和 win(未提供dll)
比较推荐 php-memcached,毕竟在持续维护,另外他使用的是通用库,方便与其他语言共享服务端,但比较麻烦的是,未提供 编译好的 win 扩展,win 编译扩展是个头疼的事 ,若没有精力编译,还必须跑在 win 系统,使用 php-memcache 吧
三、安装 php-memcached
1、先装 libmemcached
$ wget http://launchpad.net/libmemcached/1.0/0.44/+download/libmemcached-0.44.tar.gz
$ tar xvzf libmemcached-0.44tar.gz
$ cd libmemcached-0.44
$ ./configure
$ make
$ sudo make install
使用 mac 可以直接 brew 安装
$ brew install libmemcached
2、再装 php-memcached
$ wget http://pecl.php.net/get/memcached-3.1.3.tgz
$ tar zxvf memcached-3.1.3.tgz
$ cd memcached-3.1.3
$ phpize #使用默认php
$ /usr/local/php/bin/phpize # 若有多版本 php 存在,可使用指定路径的 phpize
# 配置编译选项,两个参数非必须,在php和libmemcached不是系统默认安装的情况下才需要
./configure \
--with-php-config=/usr/local/php/bin/php-config \
--with-libmemcached-dir=/usr/local/libmemcached
$ make
$ sudo make install
安装中可能遇到的问题
Cannot find autoconf. Please check your autoconf installation
缺少 autoconf 库
# 源码安装, 这里就不写了, 仍然是 下载->编译->安装 的路子
# mac brew 安装
$ brew install autoconf
2.configure: error: Please reinstall the pkg-config distribution
缺少 pkg-config 库
# 源码安装, 这里就不写了, 仍然是 下载->编译->安装 的路子
# mac brew 安装
$ brew install pkg-config
3、加载扩展
若上一步骤无错误,此时应该在 php 扩展目录生成了 memcached.so
打开 php.ini (可使用 php --ini 查看路径)添加
# 请将路径改为正确的
extension="/usr/local/php/pecl/20170718/memcached.so"
此时,php cli 应该是已经生效了, 可用下面的命令判断
$ php -m|grep memcached
最后,使用 php-fpm 方式的重启 php-fpm, 使用 apache moudle 方式的 重启 apache,让 Http 请求也生效