php升级的痛苦,升级 PHP 7.4 带来的两个大坑
由于我機(jī)器用的滾動(dòng)更新的 Archlinux,不知不覺 php 已經(jīng)升級到7.4了,沒想到這次更新帶來了極大的麻煩。首先是 php-fpm 的新選項(xiàng) ProtectHome 會(huì)導(dǎo)致經(jīng)典的 File not found 錯(cuò)誤,再是 php 解釋器會(huì)對 null 類型的下標(biāo)訪問直接報(bào)錯(cuò) Trying to access array offset on value of type null。
最近在幫一個(gè)朋友張羅一個(gè)網(wǎng)站,于是把線上代碼拉回本地做鏡像進(jìn)行測試。因?yàn)閣eb應(yīng)用有些奇怪的依賴,為了不污染本機(jī)的環(huán)境,我就把它部署在 Docker 中進(jìn)行測試。Docker 的基礎(chǔ)鏡像選擇了激進(jìn)的 Archlinux,搭配上個(gè)月底才出爐的 php7.4。于是花了整整一個(gè)下午栽在 Debug 大坑中…
首先是一把梭配好了環(huán)境后,一跑,報(bào)了Php-fpm最經(jīng)典也是最坑的錯(cuò)誤之一:File not found 。配過 php-fpm 的都知道出現(xiàn)這個(gè)錯(cuò)誤一般是文件權(quán)限不對或者文件路徑不對,而這兩個(gè)錯(cuò)誤都是比較難找的。于是我又雙叒叕體驗(yàn)了一把大眼瞪小眼的路徑檢查,沒問題。文件權(quán)限檢查,emmm也沒問題呀?又返回去檢查路徑,還是沒問題!搞到最后氣的 chmod 777一把梭竟然也沒能解決問題,有點(diǎn)懷疑人生…
網(wǎng)上搜索 php-fpm 的 File not found 錯(cuò)誤,雖然結(jié)果很多,可原因都只有這兩個(gè)。而這兩個(gè)原因也都被一一排除了,事情突然向神奇的角度發(fā)展起來了...
不知過了多久之后我才想到可能是跟 php 版本有關(guān)(因?yàn)槲冶緳C(jī)也跑了其它 php 應(yīng)用,所以一開始并不覺得 php 有問題)。于是我去搜了一下新版 php7.4 及 php-fpm7.4 的改動(dòng),一下就發(fā)現(xiàn)了罪魁禍?zhǔn)?#xff1a;php7.4 Commit
這個(gè)提交中添加了一個(gè)選項(xiàng):ProtectHome 。顧名思義,開啟了之后 php 不會(huì)去執(zhí)行在家目錄中的文件 ——而這個(gè)新選項(xiàng)的默認(rèn)值恰好是開啟的。使用 systemctl edit php-fpm.service 添加一個(gè)選項(xiàng)覆蓋,重啟服務(wù)后,終于一切正常,并迎來第二個(gè)大坑錯(cuò)誤:
php 中經(jīng)常使用 inlcude,require 等來包含其它文件。而調(diào)試發(fā)現(xiàn)在某個(gè) include 之后,php 直接停止執(zhí)行并報(bào)錯(cuò) Trying to access array offset on value of type null。但是在線上的代碼跑起來卻一點(diǎn)問題也沒有,這就很奇怪了,跟到 include 的文件中之后發(fā)現(xiàn)是有個(gè)地方在訪問數(shù)組元素,而數(shù)組本身卻是 null 。在 php 這種弱類型語言中這種語法一般是支持的,它會(huì)整體返回 null ,而在新版的 php7.4 中這個(gè)語法卻會(huì)報(bào)告為錯(cuò)誤。看來Php也在一點(diǎn)點(diǎn)規(guī)范語言的特性,沒辦法,這個(gè)只能自己改代碼了。(雖然我目前選擇了使用舊版本的 php)
由于 php7.4 在上個(gè)月底才剛剛發(fā)布,估計(jì)還沒有大面積更新使用,各個(gè)應(yīng)用的開發(fā)者可能也沒有針對 php7.4 進(jìn)行過測試和兼容修改。也正是因此,在網(wǎng)上搜索這些信息時(shí),找不到什么有價(jià)值的建議,這篇文章除了記錄下被這個(gè)新特性坑了一下午之外,也算給其它人留一個(gè)解決類似問題的思路吧。
總結(jié)
以上是生活随笔為你收集整理的php升级的痛苦,升级 PHP 7.4 带来的两个大坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php多线程foreach,php中fo
- 下一篇: php未正确拼写字 css,前端Bug解