一荞怒、背景
項(xiàng)目一直處于PHP5.6的運(yùn)行環(huán)境中,決定將PHP升級(jí)到PHP7秧秉,考慮的原因主要包括:
1褐桌、PHP7的正式版也已經(jīng)發(fā)布了很長(zhǎng)時(shí)間,就穩(wěn)定性和資料的豐富程度來(lái)說(shuō)都足夠了
2象迎、看到PHP5.*的不會(huì)進(jìn)行安全維護(hù)的通知
3撩嚼、PHP7相對(duì)PHP5的性能相關(guān)有提升
4、生命不息挖帘,折騰不止
特此將升級(jí)過(guò)程及步驟進(jìn)行記錄,希望可以幫到有類似需求的小伙伴恋技!
二拇舀、安裝PHP7
這個(gè)步驟就不多說(shuō)了,從網(wǎng)上查找下安裝過(guò)程蜻底,按照教程進(jìn)行即可骄崩。(ps:公司的服務(wù)器上已經(jīng)有其他同事安裝過(guò)了,我直接使用就好了)
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
三薄辅、項(xiàng)目使用PHP7環(huán)境
測(cè)試環(huán)境上運(yùn)行的項(xiàng)目有很多要拂,所以不能直接將默認(rèn)的php替換成PHP7,采用的方式是使用nginx配置進(jìn)行處理,設(shè)置這個(gè)項(xiàng)目使用phpfpm7站楚。
調(diào)用項(xiàng)目中的測(cè)試接口脱惰,測(cè)試接口內(nèi)容:echo phpinfo(); 可以觀察到已經(jīng)替換為PHP7了!
四窿春、靜態(tài)代碼檢測(cè)
眾所周知拉一,PHP7廢除了很多函數(shù),所以我們需要對(duì)代碼進(jìn)行檢測(cè)項(xiàng)目的兼容性旧乞。
采用的方法是利用 PHPCS和PHPCompatibility 對(duì)項(xiàng)目進(jìn)行PHP7的編碼規(guī)范檢測(cè)蔚润。
//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 [項(xiàng)目路徑]
之后就可以根據(jù)生成的報(bào)表'/tmp/check_php7_report',逐條對(duì)項(xiàng)目代碼進(jìn)行處理了尺栖。
五嫡纠、錯(cuò)誤日志哪去了?
項(xiàng)目使用的是ThinkPHP3.2.2框架,但是到目前為止除盏,仍未找到錯(cuò)誤日志輸出到哪里了叉橱,之后有時(shí)間再繼續(xù)進(jìn)行吧,大概流程如下:
1痴颊、首先在nginx中增加如下配置:
error_log logs/error.log error;
然后經(jīng)過(guò)幾天的使用赏迟,從未看到有過(guò)日志記錄,認(rèn)為沒(méi)有出現(xiàn)問(wèn)題蠢棱。
2锌杀、突發(fā)奇想,想驗(yàn)證下錯(cuò)誤情況是可以被記錄的泻仙,于是寫了個(gè)接口糕再,具體內(nèi)容:
$str = 'asdasdaiAAS';
echo preg_replace("/([A-Z])/e", "'_' . strtolower('\\1')", $str);
在Linux下執(zhí)行PHP腳本輸出以下內(nèi)容,同理接口也應(yīng)該返回同意內(nèi)容:
php5.6 : asdasdai_a_a_s
php7 :PHP Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in ..
3玉转、但是實(shí)際情況突想,在PHP5.6接口返回與預(yù)期符合,但是在PHP7直接返回空并且httpcode為200(問(wèn)題出現(xiàn))
4究抓、初步猜測(cè)是由于ThinkPHP框架導(dǎo)致未記錄錯(cuò)誤情況猾担,所以查看其配置及框架的日志,均未發(fā)現(xiàn)異常刺下。
5绑嘹、未完待續(xù),等有時(shí)間再查下錯(cuò)誤日志去哪了
六橘茉、接口檢測(cè)
本來(lái)是想通過(guò)錯(cuò)誤日志來(lái)確認(rèn)接口是否存在問(wèn)題的工腋,但是由于找不到錯(cuò)誤日志,所以無(wú)奈下?lián)Q另外的方案:
1畅卓、通過(guò)nginx的日志獲取調(diào)用過(guò)的接口擅腰,然后跟項(xiàng)目所有接口去重,找到未調(diào)用的接口
2翁潘、調(diào)用過(guò)的接口使用腳本分別在PHP5.6和PHP7的環(huán)境下重新調(diào)用獲取返回值趁冈,把兩次的返回值md5加密后進(jìn)行對(duì)比
有了方案后處理起來(lái)并不難,按照預(yù)期應(yīng)該是一致的拜马,但是確實(shí)存在問(wèn)題了O淦纭(從側(cè)面也說(shuō)明這個(gè)接口檢測(cè)是很有必要的,不能僅靠測(cè)試人員在功能上驗(yàn)證)
七一膨、發(fā)現(xiàn)的坑及填坑方法
1呀邢、問(wèn)題:php7的json_encode處理float類型會(huì)出現(xiàn)溢出的現(xiàn)象
php5.6:[6.28]
php7:[6.2800000000000002]
解決方案:修改php.ini中serialize_precision 到17以下,自測(cè)php7恢復(fù)正常
2豹绪、問(wèn)題:在命令行解決了json_encode溢出問(wèn)題价淌,然后接口還是會(huì)存在問(wèn)題
解決方案:重啟PHP7的phpfpm
3申眼、問(wèn)題:php7的計(jì)算中,如果除數(shù)為0會(huì)導(dǎo)致結(jié)果為NAN
php5.6:0
php7:NAN
解決方案:判斷下除數(shù)為0的情況
八蝉衣、結(jié)語(yǔ)
這次升級(jí)PHP7的工作還沒(méi)有結(jié)束括尸!目前只是完成自測(cè)部分,等待測(cè)試通過(guò)后病毡,完美上線才能算收工大吉濒翻!
如果后續(xù)還有發(fā)現(xiàn)坑,會(huì)及時(shí)更新在這邊的啦膜。
希望可以前路坦蕩有送,一路無(wú)坑嘍~