安装php扩展之memcached(转)

服务器环境

  • 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**```shell

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 扩展**```shell

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_64Error: php70u-common conflicts with php-common-5.4.16-42.el7.x86_64Error: 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 章节

觉得文章不错,打个赏如何?

打赏

微信扫码

pay_weixin

长按识别二维码

果子
About

冷蟊初退,孤灯野澜,志起鸡鸣,墓不悲秋!

Posted in Linux

Leave a Reply