项目一贯处于PHP5.6的运行环境中,决定将PHP升级到PHP7,考虑的缘故原由紧张包括:
1、PHP7的正式版也已经发布了很永劫光,就稳定性和资料的丰富程度来说都足够了
2、看到PHP5.的不会进行安全掩护的关照
3、PHP7相对PHP5的性能干系有提升
4、生命不息,折腾不止
特此将升级过程及步骤进行记录,希望可以帮到有类似需求的小伙伴!
二、安装PHP7
这个步骤就不多说了,从网上查找下安装过程,按照教程进行即可。(ps:公司的做事器上已经有其他同事安装过了,我直策应用就好了)
php7和php5.6详细信息:# php7 -vPHP 7.1.12 (cli) (built: Jun 8 2018 19:36:50) ( NTS )Copyright (c) 1997-2017 The PHP GroupZend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies# php -vPHP 5.6.10 (cli) (built: Jun 8 2018 14:46:07) Copyright (c) 1997-2015 The PHP GroupZend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
三、项目利用PHP7环境
测试环境上运行的项目有很多,以是不能直接将默认的php更换成PHP7,采取的办法是利用nginx配置进行处理,设置这个项目利用phpfpm7。
调用项目中的测试接口,测试接口内容:echo phpinfo(); 可以不雅观察到已经更换为PHP7了!
四、静态代码检测
众所周知,PHP7废除了很多函数,以是我们须要对代码进行检测项目的兼容性。
采取的方法是利用 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框架,但是到目前为止,仍未找到缺点日志输出到哪里了,之后有韶光再连续进行吧,大概流程如下:
1、首先在nginx中增加如下配置:
error_log logs/error.log error;
然后经由几天的利用,从未看到有过日志记录,认为没有涌现问题。
2、突发奇想,想验证下缺点情形是可以被记录的,于是写了个接口,详细内容:
$str = 'asdasdaiAAS'; echo preg_replace(\公众/([A-Z])/e\"大众, \"大众'_' . strtolower('\\1')\"大众, $str); 在Linux下实行PHP脚本输出以下内容,同理接口也该当返回赞许内容:php5.6 : asdasdai_a_a_sphp7 :PHP Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in ..
3、但是实际情形,在PHP5.6接口返回与预期符合,但是在PHP7直接返回空并且httpcode为200(问题涌现)
4、初步预测是由于ThinkPHP框架导致未记录缺点情形,以是查看其配置及框架的日志,均未创造非常。
5、未完待续,等有韶光再查下缺点日志去哪了
六、接口检测
本来是想通过缺点日志来确认接口是否存在问题的,但是由于找不到缺点日志,以是无奈下换其余的方案:
1、通过nginx的日志获取调用过的接口,然后跟项目所有接口去重,找到未调用的接口
2、调用过的接口利用脚本分别在PHP5.6和PHP7的环境下重新调用获取返回值,把两次的返回值md5加密后进行比拟
有了方案后处理起来并不难,按照预期该当是同等的,但是确实存在问题了!
(从侧面也解释这个接口检测是很有必要的,不能仅靠测试职员在功能上验证)
七、创造的坑及填坑方法
1、问题:php7的json_encode处理float类型会涌现溢出的征象
php5.6:[6.28] php7:[6.2800000000000002]
办理方案:修正php.ini中serialize_precision 到17以下,自测php7规复正常
2、问题:在命令行办理了json_encode溢出问题,然后接口还是会存在问题
办理方案:重启PHP7的phpfpm
3、问题:php7的打算中,如果除数为0会导致结果为NAN
php5.6:0 php7:NAN
办理方案:判断下除数为0的情形
八、结语
这次升级PHP7的事情还没有结束!
目前只是完成自测部分,等待测试通过后,完美上线才能算收工大吉!
如果后续还有创造坑,会及时更新在这边的。
希望可以前路开阔,一起无坑喽~
作者:caohaoyu
链接:https://www.jianshu.com/p/bb0784f6ec7c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者得到授权并注明出处。