首頁  >  文章  >  後端開發  >  升級Php 7.4帶來的兩個大坑

升級Php 7.4帶來的兩個大坑

藏色散人
藏色散人轉載
2020-02-08 13:07:145387瀏覽

由於我機器用的滾動更新的Archlinux,不知不覺Php已經升級到7.4了,沒想到這次更新帶來了極大的麻煩。首先是Php-fpm的新選項ProtectHome會導致經典的File not found錯誤,再是Php解釋器會對null類型的下標存取直接報錯Trying to access array offset on value of type null。

最近在幫朋友張羅一個網站,於是把線上程式碼拉回本地做鏡像進行測試。因為web應用有些奇怪的依賴,為了不污染本機的環境,我就把它部署在Docker中測試。 Docker的基礎映像選擇了激進的Archlinux,搭配上個月底才出爐的Php7.4。於是花了整整一個下午栽在Debug大坑中…

首先是一把梭配好了環境後,一跑,報了Php-fpm最經典也是最坑的錯誤之一:File not found。配過Php-fpm的都知道出現這個錯誤一般是檔案權限不對或是檔案路徑不對,而這兩個錯誤都是比較難找的。於是我又雙叒叕體驗了一把大眼瞪小眼的路徑檢查,沒問題。檔案權限檢查,emmm也沒問題呀?又返回去檢查路徑,還是沒問題!搞到最後氣的chmod 777一把梭竟然也沒能解決問題,有點懷疑人生…

網上搜尋Php-fpm的File not found錯誤,雖然結果很多,可原因都只有這兩個。而這兩個原因也都被一一排除了,事情突然向神奇的角度發展起來了...

不知過了多久之後我才想到可能是跟Php版本有關(因為我本機也跑了其它Php應用,所以一開始並不覺得Php有問題)。於是我去搜了一下新版Php7.4及Php-fpm7.4的改動,一下就發現了罪魁禍首:

Php7.4 Commit

#(https:// github.com/php/php-src/commit/40c4d7f1820df1872a71ab07fd26da45a203e37f#diff-c0605c0e7e1db864472acf66a9812d605c0e7e1db864472acf66a9812d3#R22)。顧名思義,開啟了之後php不會去執行在家目錄中的檔案-而這個新選項的預設值恰好是開啟的。使用systemctl edit php-fpm.service新增選項覆蓋,重啟服務後,終於一切正常,並迎來第二個大坑錯誤:

Php中經常使用inlcude,require等來包含其它檔案。而調試發現在某個include之後,php直接停止執行並報錯Trying to access array offset on value of type null。但是在線上的程式碼跑起來卻一點問題也沒有,這就很奇怪了,跟到include的文件中之後發現是有個地方在訪問數組元素,而數組本身卻是null。在Php這種弱型語言中這種語法一般是支援的,它會整體回傳null,而在新版的Php7.4中這個語法卻會報告為錯誤。看來Php也在一點規範語言的特性,沒辦法,這只能自己改程式碼了。 (雖然我目前選擇了使用舊版的Php)

由於Php7.4在也發布不久,估計還沒有大面積更新使用,各個應用的開發者可能也沒有針對Php7.4進行過測試和相容修改。也正是因此,在網路上搜尋這些資訊時,找不到什麼有價值的建議,這篇文章除了記錄下被這個新特性坑了一下午之外,也算給其它人留一個解決類似問題的思路吧。

以上是升級Php 7.4帶來的兩個大坑的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:sbw.so。如有侵權,請聯絡admin@php.cn刪除