前面章节我会先简要说明一下安装过程, 后面章节我会记录在安装期间踩过的坑.
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 依赖的 libevent;
- 然后安装 Memcached 库;
- 再安装 PHP PECL 的 Memcached 插件依赖的 libmemcached 库;
- 最后安装 PHP PECL 的 Memcached 插件.
咳咳. 我曾经因为混淆了 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 章节
参考文章
- PHP 官方文档 - Memcached
- 手动为php安装memcached扩展模块
- StackOverflow - not able to install php-devel in aws centos ec2 instance for php version 5.6.22
- Linux 编译 常用PHP 扩展
- Linux下 config/configure/Configure、make 、make test/make check、sudo make install 的作用
- Centos/RedHat 7/6/5切换阿里云源并安装EPEL/IUS/REMI仓库
- Linux 编译软件的步骤
文章历史
- 2017/07/09 (第一次发布);
- 2017/07/09 写了个 PHP 使用 Memcached 的小例子;
- 2017/07/10 修正拼写错误(将
./configure
误写成了.configure
). 修正编译 PHP 的 Memcached 插件时的编译配置错误; 增加章节 -- "为什么 PHP 的 memcached 插件需要 phpize 命令来生成 configure 文件";
如果我的文章对你有用, 希望给些改进的建议, 或者打个"喜欢" _
网友评论