由于我機器用的滾動更新的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-c0605c0e7e1db864472acf66a9812d33R22 "php commit ProtectHome")
這個提交中添加了一個選項:ProtectHome。顧名思義,開啟了之后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進行過測試和兼容修改。也正是因此,在網上搜索這些信息時,找不到什么有價值的建議,這篇文章除了記錄下被這個新特性坑了一下午之外,也算給其它人留一個解決類似問題的思路吧。
原文地址:[https://blog.sbw.so/u/php-fpm-7.4-file-not-found-array-type-null-error.html](https://blog.sbw.so/u/php-fpm-7.4-file-not-found-array-type-null-error.html)
- 技能知識點
- 對死鎖問題的理解
- 文件系統原理:如何用1分鐘遍歷一個100TB的文件?
- 數據庫原理:為什么PrepareStatement性能更好更安全?
- Java Web程序的運行時環境到底是怎樣的?
- 你真的知道自己要解決的問題是什么嗎?
- 如何解決問題
- 經驗分享
- GIT的HTTP方式免密pull、push
- 使用xhprof對php7程序進行性能分析
- 微信掃碼登錄和使用公眾號方式進行掃碼登錄
- 關于curl跳轉抓取
- Linux 下配置 Git 操作免登錄 ssh 公鑰
- Linux Memcached 安裝
- php7安裝3.4版本的phalcon擴展
- centos7下php7.0.x安裝phalcon框架
- 將字符串按照指定長度分割
- 搜索html源碼中標簽包的純文本
- 更換composer鏡像源為阿里云
- mac 隱藏文件顯示/隱藏
- 谷歌(google)世界各國網址大全
- 實戰文檔
- PHP7安裝intl擴展和linux安裝icu
- linux編譯安裝時常見錯誤解決辦法
- linux刪除文件后不釋放磁盤空間解決方法
- PHP開啟異步多線程執行腳本
- file_exists(): open_basedir restriction in effect. File完美解決方案
- PHP 7.1 安裝 ssh2 擴展,用于PHP進行ssh連接
- php命令行加載的php.ini
- linux文件實時同步
- linux下php的psr.so擴展源碼安裝
- php將字符串中的\n變成真正的換行符?
- PHP7 下安裝 memcache 和 memcached 擴展
- PHP 高級面試題 - 如果沒有 mb 系列函數,如何切割多字節字符串
- PHP設置腳本最大執行時間的三種方法
- 升級Php 7.4帶來的兩個大坑
- 不同域名的iframe下,fckeditor在chrome下的SecurityError,解決辦法~~
- Linux find+rm -rf 執行組合刪除
- 從零搭建Prometheus監控報警系統
- Bug之group_concat默認長度限制
- PHP生成的XML顯示無效的Char值27消息(PHP generated XML shows invalid Char value 27 message)
- XML 解析中,如何排除控制字符
- PHP各種時間獲取
- nginx配置移動自適應跳轉
- 已安裝nginx動態添加模塊
- auto_prepend_file與auto_append_file使用方法
- 利用nginx實現web頁面插入統計代碼
- Nginx中的rewrite指令(break,last,redirect,permanent)
- nginx 中 index try_files location 這三個配置項的作用
- linux安裝git服務器
- PHP 中運用 elasticsearch
- PHP解析Mysql Binlog
- 好用的PHP學習網(持續更新中)
- 一篇寫給準備升級PHP7的小伙伴的文章
- linux 安裝php7 -系統centos7
- Linux 下多php 版本共存安裝
- PHP編譯安裝時常見錯誤解決辦法,php編譯常見錯誤
- nginx upstream模塊--負載均衡
- 如何解決Tomcat服務器打開不了HOST Manager的問題
- PHP的內存泄露問題與垃圾回收
- Redis數據結構 - string字符串
- PHP開發api接口安全驗證
- 服務接口API限流 Rate Limit
- php內核分析---內存管理(一)
- PHP內存泄漏問題解析
- 【代碼片-1】 MongoDB與PHP -- 高級查詢
- 【代碼片-1】 php7 mongoDB 簡單封裝
- php與mysql系統中出現大量數據庫sleep的空連接問題分析
- 解決crond引發大量sendmail、postdrop進程問題
- PHP操作MongoDB GridFS 存儲文件,如圖片文件
- 淺談php安全
- linux上keepalived+nginx實現高可用web負載均衡
- 整理php防注入和XSS攻擊通用過濾