编译安装 PHP 的 Memcached 扩展

image.png

前面章节我会先简要说明一下安装过程, 后面章节我会记录在安装期间踩过的坑.
Linux 下编译软件的步骤参见Linux 编译软件的步骤


服务器环境

  • CentOS 7
  • PHP 7.0.20
  • Nginx 1.10.1

安装 PHP 扩展的通用流程

  • 1.下载解压
cd /usr/local/src #一般把第三方软件的源码放在这个目录
wget http://xxx.com/ #软件源码下载地址
tar -zxvf 压缩包 #解压缩. 根据不同类型的压缩包,使用不同的解压缩命令, 比如 ".gz 压缩包"使用 -zx , ".bz 压缩包"使用 -jx
  • 2.编译安装
cd /解压缩后/的文件夹
/usr/local/bin/phpize #用 phpize 命令生成 configure 配置文件
./configure --with-php-config=/usr/local/php/bin/php-config   #配置
make  #编译
sudo make install  #安装
  • 3.修改 php.ini

在 php.ini 中添加:

extension=名称.so # "名称"为扩展的名称. 或者可以用重定向的命令修改 php.ini sudo echo extension=名称.so >> /etc/php.ini 
  • 4.重启服务
php -m | grep 扩展名称 #验证是否正确安装上了扩展
sudo systemctl reload php-fpm nginx #systemctl 是 CentOS 7 的命令

编译安装 Memcached 扩展

  • 1.安装 memcached
    • 编译安装 memcached 依赖的 libevent 库
cd /usr/local/src
wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz
tar -zxvf libevent-2.1.8-stable.tar.gz
cd libevent-2.1.8-stable
./configure --prefix=/usr/local/libevent
make && make test && sudo make install
- **编译安装 memcached**
cd /usr/local/src
wget http://memcached.org/files/memcached-1.4.39.tar.gz
tar -zxvf memcached-1.4.39.tar.gz
cd memcached-1.4.39.tar.gz
./configure --prefix=/usr/local/memcached
make && make test && sudo make install
  • 2.安装 PHP 的 Memcached 扩展
    • 编译安装 Memcached 扩展插件依赖的 libmemcached 库
cd /usr/local/src
wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18.tar.gz
./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached/bin/memcached
make && make test && sudo make install
- **编译安装 PHP PECL 的 Memcached 扩展**
cd /usr/local/src
wget https://pecl.php.net/get/memcached-3.0.3.tgz
tar -zxvf memcached-3.0.3.tgz
cd memcached-3.0.3
/usr/local/bin/phpize #用 phpize 命令生成 configure 配置文件
./configure --with-php-config=/usr/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached
make && make test && sudo make install

验证一下 memcached 插件是否正确安装:

ls /usr/lib64/php/modules | grep memcached
  • 3.修改 php.ini
vim /etc/php.ini #可以通过 whereis php 来查看 php.ini 文件的位置

在 php.ini 中添加:

extension=memcached.so
  • 4.重启服务
sudo systemctl reload php-fpm

编译 Memcached 过程中踩过的坑

总共需要编译哪些软件?

总共需要编译安装 4 个软件:

咳咳. 我曾经因为混淆了 Memcached 和 PHP 的 memcached 插件, 而浪费了很多时间. 囧


如何寻找 phpize 命令和 php-config 命令?

使用 whereis 命令, 比如:

whereis phpize #会显示类似路径, 像这样 phpize: /usr/bin/phpize /usr/share/man/man1/phpize.1.gz
whereis php-config #会显示类似路径, 像这样 php-config: /usr/bin/php-config /usr/share/man/man1/php-config.1.gz

或者使用 find 命令:

sudo find / -name phpize
sudo find / -name php-config

PS. php-config 是获取所安装的 PHP 配置信息的命令行脚本.
在编译扩展时,如果安装有多个 PHP 版本,可以在配置时用 --with-php-config 选项来指定使用哪一个版本编译,该选项指定了相对应的 php-config 脚本的路径.


没有 php-config 命令怎么办?

如果 PHP 是通过编译安装的, php-config 命令会在 PHP 安装目录的 bin 目录下.
但是如果 PHP 是用 yum 安装的, 是没有 php-config的. 需要额外安装相应版本的 php-devel 包:

# 因为我是用 yum 安装的 php70u, 所以
yum search php70u-devel
sudo yum install php70u-devel.x86_64

之后 whereis php-config, 就会发现已经出现在 /usr/bin/php-config.

PS. "devel" 表示库的源码.
提醒: 用 yum 安装库, 不光要安装库本身(可执行文件), 往往还需要安装库的源码 xxx-devel

注意:
网上有些建议直接安装 php-devel:

yum install php-devel

但是我执行这个命令碰到这样的报错(估计由于这台服务器之前安装过 PHP 5.4):

Error: php70u-cli conflicts with php-cli-5.4.16-42.el7.x86_64
Error: php70u-common conflicts with php-common-5.4.16-42.el7.x86_64
Error: php70u-json conflicts with php-common-5.4.16-42.el7.x86_64
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

所以建议还是用 yum 搜索安装对应 PHP 版本的 devel 为妥.


用 yum 搜索不到高版本的 php-devel 怎么办?

官方的 yum 仓库可能没有比较新的库文件, 可以添加公认不错的 ius 仓库:

如果是 CentOS 7:

sudo yum install https://centos7.iuscommunity.org/ius-release.rpm -y

如果是 CentOS 6:

sudo yum install https://rhel6.iuscommunity.org/ius-release.rpm -y

也可以参考这篇文章 -- Centos/RedHat 7/6/5切换阿里云源并安装EPEL/IUS/REMI仓库.


在 PECL 中搜索 "memcached" 有 3 个结果, 如何选择?

在 PECL 中搜索 "memcached" 有 3 个结果:

image.png
  • mysqlnd_memcache 是将 SQL 语句转化成 MySQL InnoDB memcached Daemon, 可以排除;
  • memcache 最近的 stable 版本 是在 2012-09-22, 说明已经停止维护, 排除;
  • memcached 插件, 需要依赖 libmemcached 库, 安装比较麻烦, 不过更新更频繁, 而且最新的 stable 版本是 2017-02-20. 所以选择这个插件.

为什么 PHP 的 memcached 插件需要 phpize 命令来生成 configure 文件?

因为 PHP 插件和 PHP 是深度耦合的.
而每个人的 PHP 环境是不一样的(PHP 版本不同), 所以需要根据环境来定制 configure.

比如分别在我的服务器和笔记本上执行 phpize 命令, 会获得这样结果:


image.png
image.png

两者是不同的


编译时报错

编译时报错:

make -j2  all-am
make[1]: Entering directory `/usr/local/src/libmemcached-1.0.18'
  CXX      libhashkit/libhashkit_libhashkit_la-aes.lo
./libtool: line 1125: g++: command not found
make[1]: *** [libhashkit/libhashkit_libhashkit_la-aes.lo] Error 1
make[1]: Leaving directory `/usr/local/src/libmemcached-1.0.18'
make: *** [all] Error 2

根据高人指点, 安装编译时可以一股脑装上这些依赖库:

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel \
libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel \
zlib zlib-devel glibc glibc-devel glib2 glib2-devel \
bzip2 bzip2-devel ncurses ncurses-devel \
curl curl-devel e2fsprogs e2fsprogs-devel \
krb5 krb5-devel libidn libidn-devel \
openssl openssl-devel openldap openldap-devel \
nss_ldap openldap-clients openldap-servers gd gd2 \
gd-devel gd2-devel perl-CPAN pcre-devel

如果报错中包含 permission denied, 表示是用户组的权限问题, 说明你在 make install 前面忘了加 sudo, 或者你可以 su 进入管理员帐号再进行编译操作.


安装后, 如何在 PHP 中使用 Memcached?

给个小例子:

在服务器中启动 Memcached:

/usr/local/memcached/bin/memcached -m 64 -p 11211 -u nobody -d
参数 说明 默认值
-m 最大使用内存量(单位 MB) 64
-p 端口号 11211
-u 用户名(在使用 root 运行的时候) nobody
-d 做为后台程序(Daemon)启动 -

然后写个简单的 PHP 文件:

<?php
$mem = new Memcached(); //实例化一个 Memcached 的对象
$mem->addServer('127.0.0.1', 11211) or die ('Could not connect'); //连接 Memcached 服务器
$mem->set('name', 'phper'); //设置 key - value 值
echo $mem->get('name'); //通过 key 取 value

PS. 其它详细的用法, 可以参考 PHP 官方文档的 Memcached 章节


参考文章


文章历史

  • 2017/07/09 (第一次发布);
  • 2017/07/09 写了个 PHP 使用 Memcached 的小例子;
  • 2017/07/10 修正拼写错误(将 ./configure误写成了 .configure). 修正编译 PHP 的 Memcached 插件时的编译配置错误; 增加章节 -- "为什么 PHP 的 memcached 插件需要 phpize 命令来生成 configure 文件";

如果我的文章对你有用, 希望给些改进的建议, 或者打个"喜欢" _

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容