
PHP 版本升級要注意什麼?
版本的生命週期
PHP 的每個主要版本大致遵循固定的支援週期:約兩年的主動支援(修正一般錯誤與安全性問題),接著約一年的安全性支援(僅修正安全問題),之後停止維護。
換句話說,一個版本從發布到完全停止支援,大約三年。
實際的日期會依版本而異,建議直接查閱官方的支援時程表,不要憑印象判斷。
為什麼不能停在舊版
一、安全風險
停止支援後,即使發現新的安全漏洞也不會再有官方修補。這與網站系統或外掛停止維護是同樣的問題。
更麻煩的是:漏洞公開之後,未更新的環境反而更容易成為自動化攻擊的目標。詳見更新與弱點管理。
二、主機商會強制淘汰
多數主機商不會無限期提供舊版本。當主機商公告停止支援某個版本時,你可能只有數週的時間處理。
臨時被迫升級的風險,遠高於有計畫的升級。
三、效能差異明顯
PHP 7 之後每一版都有效能改善。從很舊的版本升上來,通常能得到可觀的執行效率提升,而且不需要改任何程式碼。
四、套件不再支援
第三方套件會逐步放棄對舊版本的支援。停在舊版意味著無法使用新版套件,連帶也拿不到它們的安全修補。
升級前的相容性檢查
一、確認目前的版本與環境
php -v php -m # 已載入的擴充套件 php --ini # 設定檔位置
注意命令列與網頁環境可能使用不同的設定檔——透過網頁執行 phpinfo() 確認實際生效的版本與設定。
二、用靜態分析工具掃描
有專門檢測版本相容性的工具,可以在不執行程式的情況下找出可能有問題的語法。
常見的做法是先掃描一輪,把明確的問題列成清單,再逐項處理。
三、檢查擴充套件
某些擴充套件在新版可能已被移除或改名。升級前確認:
- 目前載入的擴充在新版是否仍存在
- 是否有替代方案
- 第三方套件的相容版本
四、檢查第三方套件
若使用套件管理工具,可先在測試環境嘗試更新,確認相依關係是否能解決。
升級的標準流程
- 完整備份——程式碼與資料庫
- 建立測試環境——與正式環境相同的版本與設定
- 在測試環境升級並開啟完整的錯誤記錄
- 逐一走過主要功能——前台、後台、表單、金流、排程
- 檢視錯誤日誌——包含警告與棄用通知
- 修正問題後重複測試
- 正式環境升級,選在流量低的時段
- 升級後持續觀察數日的日誌
第五步不要只看致命錯誤
棄用通知(Deprecated)是下一版的致命錯誤。 現在忽略,下次升級就會爆掉。
建議在測試環境設定:
error_reporting = E_ALL display_errors = Off log_errors = On
這樣所有問題都會進日誌,但不會顯示在畫面上。
跨越多個版本的升級
如果從很舊的版本升級(例如 5.6 或 7.0),建議分階段進行,而不是一次跳到最新。
理由是:每一版的破壞性變更不同,一次跳多版時,錯誤訊息會混在一起難以判斷來源。
分階段的做法是每次升一個主要版本,確認穩定後再進行下一階段。
升級後常見的狀況
| 症狀 | 常見原因 |
|---|---|
| 502 錯誤 | PHP-FPM 的 socket 路徑改變,網頁伺服器設定未同步 |
| 白畫面 | 致命錯誤但未顯示,需查日誌 |
| 部分功能失效 | 擴充套件未安裝或已移除 |
| 大量警告 | 舊寫法在新版被限縮 |
| 設定失效 | php.ini 未沿用,或路徑改變 |
第一項最常見。 升級後務必確認網頁伺服器設定中的 socket 路徑,見Nginx 與 Apache 的疑難排解。
把版本升級排入常態工作
建議的節奏:
- 每年檢視一次目前使用的版本與其支援狀態
- 在進入安全性支援階段時就開始規劃升級,而不是等到完全停止支援
- 把版本升級的責任歸屬寫進維護合約——主機商、廠商還是自己
責任歸屬常常沒有講清楚,結果各方都以為是別人在負責。
本文的設定與語法以 PHP 8.x 為例,實際的參數、預設值與支援狀態可能因版本與發行版而異。各版本的支援時程請以 PHP 官方公告為準。套用前請先在測試環境驗證,並確實備份原設定檔。