35

php-memcached 扩展升级小记

 5 years ago
source link: https://mp.weixin.qq.com/s/HZf1GVpl92gL6lqbLwLBww?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今天无意中在工作邮箱翻到了一封邮件,说的是2017年底php-memcached扩展的一个安全漏洞(https://github.com/php-memcached-dev/php-memcached/issues/339),由于当时线上业务并没受影响,所以就没太关注。今天突然发现自己开发机使用的还是php-memcache扩展,所以就升级了一下(centos/apache/php5.6环境)。

php-memcached

php-memcache

扩展都是php的memcached客户端扩展,仅有一字之差,建议使用php-memcached扩展,关于两者的比较,后续有机会我再学习。在开发机升级后,就顺带在自己的阿里云ECS上也升级了下(ubuntu/php7.1),事情虽小,但自己也学习了很多,主要包括pecl、libmemcachd、phpize等知识,然后写下了此文。

libmemcachd和php-memcached版本

php-memcached扩展是基于libmemcached开发的,核心的功能都来源于libmemcached,libmemcachd是一个C语言开发的库,这个库比较稳定,最新的版本是2014年发布的1.0.18。

php-memcached不管是源代码编译还是包安装,基本上都是由PECL(https://pecl.php.net/package/memcached,/usr/share/doc/php-memcached/README.markdown)提供的,主要分为两个版本:

  • 3.x版本:提供给php5.6以上的版本(包括php7)使用,依赖libmemcached 1.x以上的版本。

  • 2.x版本:提供给php5.6一下的版本使用,依赖libmemcached 0.44以上的版本。

至于什么是PECL,它其实类似于PHP的扩展软件安装库,也类似于apt-get这样的软件安装工具,只是PECL安装的是php扩展(大部分是.so文件)。

PECL安装php-memcached

在开发机上,我尝试使用pecl安装,由于php环境是5.6,所以安装的是php-memcached 2.x版本,运行一个命令即可:

# 自动安装libmemcached依赖
$ pecl install php-memcached-2.0.0

这个命令隐藏了很多细节,相当于执行如下指令:

# 也可以自行去github下载(比如https://github.com/php-memcached-dev/php-memcached/releases/tag/r2.1.0)
$ pecl download memcached-2.0.0.tgz 
$ tar xvf memcached-2.0.0.tgz
$ cd memcached-2.0.0
$ phpize
# 如果libmemcached没有安装,需要安装
$ ./configure --with-libmemcached-dir=/usr
$ make 
$ make install

安装完成后,如果下列提示:

configuration option “php_ini” is not set to php.ini location You should add “extension=memcached.so” to php.ini

需要自行在php.ini中添加extension=memcached.so,或者在专门的配置文件增加扩展so文件,比如:

$ echo "extension=memcached.so" >>  /etc/php.d/memcached.ini

apt-get安装php-memcached

一般情况下,我喜欢使用包安装方式安装软件,在自己的ECS我就采用apt-get安装php-memcached。

输入下列命令搜索php-memcached:

$ apt-cache  show php7.1-memcached

会提示:

N: Can't select versions from package 'php7.1-memcached' as it is purely virtual
N: No packages found

间接说明php-memcached其实挺简单的,不用刻意根据php版本寻找,直接输入以下命令即可:

$ apt-cache policy  php-memcached

输出如下:

*** 3.0.4+2.2.0-3+ubuntu14.04.1+deb.sury.org+1 0
    990 http://ppa.launchpad.net/ondrej/php/ubuntu/ trusty/main amd64 Packages
    100 /var/lib/dpkg/status

然后查看该扩展的信息:

$ apt-cache show php-memcached

关键输出如下:

Maintainer: Debian PHP PECL Maintainers <[email protected]>
Architecture: amd64
Version: 3.0.4+2.2.0-3+ubuntu14.04.1+deb.sury.org+1
Provides: php5.6-memcached, php7.0-memcached, php7.1-memcached, php7.2-memcached, php7.3-memcached

可见,这个安装包还是很智能的,php5.6都可以使用该包安装php-memcached扩展。

然后安装就很简单了:

$ apt-get install php-memcached

它会自动安装libmemcachd扩展,在我的ECS安装的是php-memcached 3.0.4版本,libmemcachd采用最新的1.0.18版本。

安装后,会自行配置对应SAPI的memcached.ini文件,也会自动重启对应的apache或nginx,非常方便,完全是自动化安装。

如果感兴趣也可以输入下列命令查看php-memcached安装了那些文件:

$ dpkg -L php-memcached

我最近写了一本新书 《深入浅出HTTPS:从原理到实战》 ,本书github地址 https://github.com/ywdblog/httpsbook,大家可以一起讨论。

本书豆瓣地址 https://book.douban.com/subject/30250772/(或点击文末“阅读原文”),如果你读了本书,还请写个评论。

也可以关注我的公众号(ID: yudadanwx, 虞大胆的叽叽喳喳

)。

IBJNNfe.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK