在 PHP 7.0 发布一年之后,终于看到 PHP 7.1 稳定版发布,有不少新特性,迫不及待地想尝试一下这个版本。本文是介绍从 PHP 7.0.5 升级到 PHP 7.1.0,如果是新安装,可以参考这里:http://www.lnmp.cn/installing-php7-mysql57-nginx18-under-centos7.html大同小异
PHP 7.0.5 之前是安装在 /usr/local/php-7.0.5
首先下载源码,我一般都是放在 /usr/local/src 中
[root@lnmp lnmp.cn]# cd /usr/local/src
[root@lnmp src]# wget -c http://cn2.php.net/get/php-7.1.0.tar.gz/from/this/mirror -O php-7.1.0.tar.gz
然后解压并进入解压后的源码目录
[root@lnmp src]# tar -zxvf php-7.1.0.tar.gz
[root@lnmp src]# cd php-7.1.0/
接下来开始安装了,可以先关闭 php-fpm, 也可以不关闭,其实没有关系。
既然是升级,为了不影响现有网站在升级后的正常运行,那就要做到升级后的 configure 和之前的版本基本一致。这就要把之前安装 PHP 的 configure 找出来,如果你忘记了之前的 configure (应该也没有人去记它吧),其实它就在 phpinfo 里边
[root@lnmp php-7.1.0]# php -i | grep configure
Configure Command => './configure' '--prefix=/usr/local/php-7.0.5' '--enable-fpm' '--with-fpm-user=nginx' '--with-fpm-group=nginx' '--with-mysqli' '--with-zlib' '--with-curl' '--with-gd' '--with-jpeg-dir' '--with-png-dir' '--with-freetype-dir' '--with-openssl' '--enable-mbstring' '--enable-xml' '--enable-session' '--enable-ftp' '--enable-pdo' '-enable-tokenizer' '--enable-zip'
稍作替换就可以得到想要的 configure 命令了
[root@lnmp php-7.1.0]# php -i | grep configure | sed -e "s/Configure Command => //; s/'//g"
./configure --prefix=/usr/local/php-7.0.5 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --enable-zip
[root@lnmp php-7.1.0]#
当然也可以从 php-config 命令获取 configure 选项
这个这里要特别提到一下就是,如果之前的 PHP 版本在安装后有用 PECL 或 phpize 新增过扩展的话,如果这些扩展可以加到 configure 里边,尽量加,否则安装后还要重新安装一次这些扩展
开始安装, 安装到 /usr/local/php-7.1.0
[root@lnmp php-7.1.0]# ./configure --prefix=/usr/local/php-7.1.0 --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-mysqli --with-zlib --with-curl --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-openssl --enable-mbstring --enable-xml --enable-session --enable-ftp --enable-pdo -enable-tokenizer --enable-zip
如果成功的话,可以看到有 Thank you for using PHP.的字样
接着 make
[root@lnmp php-7.1.0]# make
视机子配置不同,编译可能会要点时间。最后是
[root@lnmp php-7.1.0]# make install
至此,PHP 7.1 已经安装基本完成
[root@lnmp php-7.1.0]# /usr/local/php-7.1.0/bin/php -v
PHP 7.1.0 (cli) (built: Dec 5 2016 04:09:57) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
[root@lnmp php-7.1.0]#
下面是配置,为了不影响现有网站的运行,这里将沿用 PHP 7.0 的配置,直接从备份的文件夹拷贝过去
[root@lnmp php-7.1.0]# cp /usr/local/php-7.0.5/lib/php.ini /usr/local/php-7.1.0/lib/php.ini
[root@lnmp php-7.1.0]# cp /usr/local/php-7.0.5/etc/php-fpm.conf /usr/local/php-7.1.0/etc/php-fpm.conf
[root@lnmp php-7.1.0]# cp /usr/local/php-7.0.5/etc/php-fpm.d/www.conf /usr/local/php-7.1.0/etc/php-fpm.d/www.conf
之前有特别提到有用 PECL 或 phpize 新增过扩展的话,因为拷贝过来的 php.ini 中已经引入了那些扩展,在这里要重新安装,否则在重启 php-fpm 时会出现类似警报:
Dec 05 04:18:53 localhost.localdomain php-fpm[11533]: [05-Dec-2016 04:18:53] NOTICE: PHP message: PHP Warning: PHP Startup: Unable to load dynamic library '/usr/local/php-7.1.0/lib/php/extensions/no-debug-non-zts-20160303/memcached.so' - /usr/local/php-7.1.0/lib/php/extensions/no-debug-non-zts-20160303/memcached.so: cannot open shared object file: No such file or directory in Unknown on line 0
是要重新安装,即便从旧版本中将这些 so 文件拷贝过来也不行,否则会出现不匹配的警告:
Dec 05 05:07:42 localhost.localdomain php-fpm[11672]: [05-Dec-2016 05:07:42] NOTICE: PHP message: PHP Warning: PHP Startup: memcache: Unable to initialize module
如果已经忘记过安装过什么扩展,可以查看 php.ini 或扩展目录:
[root@lnmp no-debug-non-zts-20151012]# /usr/local/php-7.0.5/bin/php-config --extension-dir
/usr/local/php-7.0.5/lib/php/extensions/no-debug-non-zts-20151012
查看安装了哪些扩展
[root@lnmp php-7.1.0]# ls /usr/local/php-7.0.5/lib/php/extensions/no-debug-non-zts-20151012
memcache.so memcached.so opcache.a opcache.so pdo_mysql.so
其中 opcache.a opcache.so 是自带的,其他都是新增的。其他扩展之前怎么安装,现在又怎么重新安装一遍吧,这里不再累述。
配置 php-fpm 启动服务脚本
[root@lnmp php-7.1.0]# cp sapi/fpm/php-fpm.service /usr/lib/systemd/system/php-fpm-710.service
命名为 php-fpm-710.service 是为了方便后面升级,网站如果出问题也很方便切换会 php 7.0
修改启动脚本,把里边 prefix 相关的内容用实际路径代替(如果已经是正确的绝对路径,那就不需要修改)
[root@lnmp php-7.1.0]# vim /usr/lib/systemd/system/php-fpm-710.service
将
PIDFile=${prefix}/var/run/php-fpm.pid
ExecStart=${exec_prefix}/sbin/php-fpm --nodaemonize --fpm-config ${prefix}/etc/php-fpm.conf
修改成
PIDFile=/usr/local/php-7.0.5/var/run/php-fpm.pid
ExecStart=/usr/local/php-7.0.5/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php-7.0.5/etc/php-fpm.conf
在切换到 PHP 7.1.0 之前,先将 php-fpm 关闭
[root@lnmp php-7.1.0]# systemctl stop php-fpm
修改软链:
一个是 /usr/local/php,
[root@lnmp php-7.1.0]# unlink /usr/local/php
[root@lnmp php-7.1.0]# ln -s /usr/local/php-7.1.0 /usr/local/php
一个是 /usr/lib/systemd/system/php-fpm.service :
[root@lnmp php-7.1.0]# unlink /usr/lib/systemd/system/php-fpm.service
[root@lnmp php-7.1.0]# ln -s /usr/lib/systemd/system/php-fpm-710.service /usr/lib/systemd/system/php-fpm.service
重新加载服务
[root@lnmp php-7.1.0]# systemctl daemon-reload
好了之后启动 php-fpm
[root@lnmp php-7.1.0]# systemctl start php-fpm
查看状态
[root@lnmp php-7.1.0]# systemctl status php-fpm -l
● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2016-12-05 05:31:22 UTC; 9s ago
Main PID: 17367 (php-fpm)
CGroup: /system.slice/php-fpm.service
├─17367 php-fpm: master process (/usr/local/php-7.1.0/etc/php-fpm.conf)
├─17368 php-fpm: pool www
└─17369 php-fpm: pool www
已经正常运行,测试下 phpinfo 页面