升級PHP7過程記錄

1、背景

項目一直處於PHP5.6的運行環境中,決定將PHP升級到PHP7,考慮的緣由主要包括:php

一、PHP7的正式版也已經發布了很長時間,就穩定性和資料的豐富程度來講都足夠了nginx

二、看到PHP5.*的不會進行安全維護的通知git

三、PHP7相對PHP5的性能相關有提高github

四、生命不息,折騰不止json

特此將升級過程及步驟進行記錄,但願能夠幫到有相似需求的小夥伴!安全

2、安裝PHP7

這個步驟就很少說了,從網上查找下安裝過程,按照教程進行便可。(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

複製代碼

3、項目使用PHP7環境

測試環境上運行的項目有不少,因此不能直接將默認的php替換成PHP7,採用的方式是使用nginx配置進行處理,設置這個項目使用phpfpm7。服務器

調用項目中的測試接口,測試接口內容:echo phpinfo(); 能夠觀察到已經替換爲PHP7了!php7

4、靜態代碼檢測

衆所周知,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',逐條對項目代碼進行處理了。

5、錯誤日誌哪去了?

項目使用的是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框架致使未記錄錯誤狀況,因此查看其配置及框架的日誌,均未發現異常。

五、未完待續,等有時間再查下錯誤日誌去哪了

6、接口檢測

原本是想經過錯誤日誌來確認接口是否存在問題的,可是因爲找不到錯誤日誌,因此無奈下換另外的方案:

一、經過nginx的日誌獲取調用過的接口,而後跟項目全部接口去重,找到未調用的接口

二、調用過的接口使用腳本分別在PHP5.6和PHP7的環境下從新調用獲取返回值,把兩次的返回值md5加密後進行對比

有了方案後處理起來並不難,按照預期應該是一致的,可是確實存在問題了!(從側面也說明這個接口檢測是頗有必要的,不能僅靠測試人員在功能上驗證)

7、發現的坑及填坑方法

一、問題: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的狀況

8、結語

此次升級PHP7的工做尚未結束!目前只是完成自測部分,等待測試經過後,完美上線才能算收工大吉!

若是後續還有發現坑,會及時更新在這邊的。

但願能夠前路坦蕩,一路無坑嘍~

相關文章
相關標籤/搜索