美文网首页我爱编程
编译安装 PHP 的 Memcached 扩展

编译安装 PHP 的 Memcached 扩展

作者: patiencing | 来源:发表于2017-07-09 16:29 被阅读0次
    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 文件";

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

    相关文章

      网友评论

        本文标题:编译安装 PHP 的 Memcached 扩展

        本文链接:https://www.haomeiwen.com/subject/lzzshxtx.html