项目一直处于PHP5.6的运行环境中,决定将PHP升级到PHP7,考虑的缘由主要包括:php
一、PHP7的正式版也已经发布了很长时间,就稳定性和资料的丰富程度来讲都足够了nginx
二、看到PHP5.*的不会进行安全维护的通知git
三、PHP7相对PHP5的性能相关有提高github
四、生命不息,折腾不止json
特此将升级过程及步骤进行记录,但愿能够帮到有相似需求的小伙伴!安全
这个步骤就很少说了,从网上查找下安装过程,按照教程进行便可。(ps:公司的服务器上已经有其余同事安装过了,我直接使用就行了)bash
php7和php5.6具体信息:
# php7 -v
PHP 7.1.12 (cli) (built: Jun 8 2018 19:36:50) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
# php -v
PHP 5.6.10 (cli) (built: Jun 8 2018 14:46:07)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
复制代码
测试环境上运行的项目有不少,因此不能直接将默认的php替换成PHP7,采用的方式是使用nginx配置进行处理,设置这个项目使用phpfpm7。服务器
调用项目中的测试接口,测试接口内容:echo phpinfo(); 能够观察到已经替换为PHP7了!php7
众所周知,PHP7废除了不少函数,因此咱们须要对代码进行检测项目的兼容性。composer
采用的方法是利用 PHPCS和PHPCompatibility 对项目进行PHP7的编码规范检测。
//PHPCS和PHPCompatibility安装和使用流程
mkdir /tmp/php_codesniffer
curl -s http://getcomposer.org/installer | php
./composer.phar config -g repo.packagist composer https://packagist.phpcomposer.com
./composer.phar selfupdate
./composer.phar require "squizlabs/php_codesniffer=*"
cd /tmp/PHPCompatibility
git clone https://github.com/wimg/PHPCompatibility.git
/tmp/PHPCompatibility/vendor/bin/phpcs --config-set installed_paths /tmp/PHPCompatibility/PHPCompatibility/
/tmp/PHPCompatibility/vendor/bin/phpcs -i
/tmp/PHPCompatibility/vendor/bin/phpcs --standard=PHPCompatibility --report-file=/tmp/check_php7_report [项目路径]
复制代码
以后就能够根据生成的报表'/tmp/check_php7_report',逐条对项目代码进行处理了。
项目使用的是ThinkPHP3.2.2框架,可是到目前为止,仍未找到错误日志输出到哪里了,以后有时间再继续进行吧,大概流程以下:
一、首先在nginx中增长以下配置: error_log logs/error.log error;
而后通过几天的使用,从未看到有过日志记录,认为没有出现问题。
二、突发奇想,想验证下错误状况是能够被记录的,因而写了个接口,具体内容:
$str = 'asdasdaiAAS';
echo preg_replace("/([A-Z])/e", "'_' . strtolower('\\1')", $str);
在Linux下执行PHP脚本输出如下内容,同理接口也应该返回赞成内容:
php5.6 : asdasdai_a_a_s
php7 :PHP Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in ..
复制代码
三、可是实际状况,在PHP5.6接口返回与预期符合,可是在PHP7直接返回空而且httpcode为200(问题出现)
四、初步猜想是因为ThinkPHP框架致使未记录错误状况,因此查看其配置及框架的日志,均未发现异常。
五、未完待续,等有时间再查下错误日志去哪了
原本是想经过错误日志来确认接口是否存在问题的,可是因为找不到错误日志,因此无奈下换另外的方案:
一、经过nginx的日志获取调用过的接口,而后跟项目全部接口去重,找到未调用的接口
二、调用过的接口使用脚本分别在PHP5.6和PHP7的环境下从新调用获取返回值,把两次的返回值md5加密后进行对比
有了方案后处理起来并不难,按照预期应该是一致的,可是确实存在问题了!(从侧面也说明这个接口检测是颇有必要的,不能仅靠测试人员在功能上验证)
一、问题:php7的json_encode处理float类型会出现溢出的现象
php5.6:[6.28]
php7:[6.2800000000000002]
复制代码
解决方案:修改php.ini中serialize_precision 到17如下,自测php7恢复正常
二、问题:在命令行解决了json_encode溢出问题,而后接口仍是会存在问题
解决方案:重启PHP7的phpfpm
三、问题:php7的计算中,若是除数为0会致使结果为NAN
php5.6:0
php7:NAN
复制代码
解决方案:判断下除数为0的状况
此次升级PHP7的工做尚未结束!目前只是完成自测部分,等待测试经过后,完美上线才能算收工大吉!
若是后续还有发现坑,会及时更新在这边的。
但愿能够前路坦荡,一路无坑喽~