升級(jí)PHP7過(guò)程記錄

一荞怒、背景

項(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ú)坑嘍~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市僧家,隨后出現(xiàn)的幾起案子雀摘,更是在濱河造成了極大的恐慌,老刑警劉巖八拱,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阵赠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肌稻,警方通過(guò)查閱死者的電腦和手機(jī)清蚀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)爹谭,“玉大人枷邪,你說(shuō)我怎么就攤上這事〉┟蓿” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵药薯,是天一觀的道長(zhǎng)绑洛。 經(jīng)常有香客問(wèn)我,道長(zhǎng)童本,這世上最難降的妖魔是什么真屯? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮穷娱,結(jié)果婚禮上绑蔫,老公的妹妹穿的比我還像新娘。我一直安慰自己泵额,他們只是感情好配深,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫁盲,像睡著了一般篓叶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天缸托,我揣著相機(jī)與錄音左敌,去河邊找鬼。 笑死俐镐,一個(gè)胖子當(dāng)著我的面吹牛矫限,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佩抹,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼叼风,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匹摇?” 一聲冷哼從身側(cè)響起咬扇,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廊勃,沒(méi)想到半個(gè)月后懈贺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坡垫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年梭灿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冰悠。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堡妒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出溉卓,到底是詐尸還是另有隱情皮迟,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布桑寨,位于F島的核電站伏尼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尉尾。R本人自食惡果不足惜爆阶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沙咏。 院中可真熱鬧辨图,春花似錦、人聲如沸肢藐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吆豹。三九已至忧勿,卻和暖如春杉女,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸳吸。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工熏挎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晌砾。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓坎拐,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親养匈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哼勇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 下面我會(huì)詳細(xì)的介紹下我們是如何把應(yīng)用前移動(dòng)php7的,我們?cè)谶@中間遇到的問(wèn)題及處理情況呕乎,還有最終的結(jié)果积担。但首先讓我...
    優(yōu)才學(xué)院閱讀 838評(píng)論 0 5
  • 2015.12.3 發(fā)生了兩件大事, PHP7 問(wèn)世了猬仁, Swift 開源了帝璧。最好的語(yǔ)言發(fā)布了新的版本,一個(gè)劃時(shí)代...
    搬磚家閱讀 549評(píng)論 0 1
  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說(shuō)明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí)湿刽,會(huì)觸發(fā)此異常的烁。 O...
    我想起個(gè)好名字閱讀 5,320評(píng)論 0 9
  • 有個(gè)年輕人自己吞了個(gè).22子彈,然后就昏了過(guò)去诈闺。第二天早上醒來(lái)渴庆,他完全不記得昨晚的事,就去上班了雅镊。兩小時(shí)后襟雷,他說(shuō)感...
    e541c2720df7閱讀 65評(píng)論 0 0
  • 寫在前面的話 伴隨一場(chǎng)嚴(yán)重的流感晃危,我忙忙碌碌折騰了一個(gè)月叙赚。 教師共讀分享老客、教師資格證面試僚饭、生活課程分享、期末評(píng)語(yǔ)胧砰,...
    傅大江閱讀 279評(píng)論 0 4