如何解決php 500錯誤問題
php 500錯誤的解決方法:1、檢查PHP腳本並修改;2、捕獲異常並記錄異常到日誌;3、分析日誌並處理即可。
本文操作環境:Windows7系統、PHP7.1版、Dell G3電腦。
如何解決php 500錯誤問題?
#PHP與500錯誤
PHP開發過程中經常會遇到返回500錯誤的情況,而且body體中也沒有任何調試(可用)內容。這時候你就需要慢慢調試了(打斷點,開調試模式等),但如果是現網,這個錯誤就比較讓人抓狂了,既不好打斷點也不能開調試模式。但既然是錯誤,總是會有處理方法,以下就一步步分析500的成因及處理方案。
0x01、500錯誤
500錯誤,也叫Internal Server Error(內部服務錯誤),表示服務因未知錯誤導致無法處理要求。在PHP站點中一般是由PHP傳回,也就是說,500錯誤一般都是PHP腳本的錯誤。
php-fpm抓包500
從上圖可以看出(Nginx PHP-FPM架構),在PHP呼叫一個不存在的類時,腳本發生錯誤並返回500給Nginx(並且將錯誤訊息也做了返回,只不過是卸載STDERR中)。
0x02、哪些錯誤異常會導致500
那麼哪一類錯誤會導致500錯誤呢,PHP所有的錯誤等級可以在PHP的官方文文檔(http ://php.net/manual/zh/errorfunc.constants.php)中查詢到,而這其中錯誤等級為E_ERROR、E_PARSE、E_RECOVERABLE_ERROR、E_USER_ERROR以及未捕獲的異常等都會導致500錯誤。
E_ERROR等級錯誤所導致的500
0x03、什麼情況下錯誤不會回傳500
#上面說了,這是PHP腳本的錯誤導致的,但PHP腳本有了錯誤或異常一定會導致500嗎?顯然不是,即使在腳本有致命錯誤的情況下,依舊可以回傳200。
display_errors設定選項
在基於python、nodejs等的web應用程式中,預設情況下,如果出現例外訊息會被列印到控制台( STDERR/STDOUT)中。而在基於PHP-FPM架構的PHP中沒有控制台可以列印,它的stderr和stdout被置為FastCGI中對應的STRDERR和STDOUT。如果將錯誤重新導向到STDOUT中,錯誤會直接輸出到回應中,且狀態碼也會置為200。這個也是display_errors選項所實現的能力。
display_errors選項的配置需要透過ini_set來實現,PHP文件中關於display_errors的配置表示該值為字串類型,實際使用中數字和布林類型也可以開啟或關閉該配置。
error_reporting配置
display_errors控制了PHP腳本發生錯誤時是否顯示錯誤詳情以及是否回傳錯誤狀態碼,而error_reporting項目則用來控制哪等級的錯誤可以直接印出來。
error_reporting的設定項目可以透過error_reporting(E_ALL)或ini_set('error_reporting', E_ALL)來配置,函數參數的詳情可以參考PHP文件。
要注意的是,PHP本身是有錯誤日誌的(error_log和log_errors兩個設定項目),若發生錯誤,PHP會將改錯誤寫入錯誤日誌中,而哪些錯誤需要被寫入是受error_reporting項的控制的。
在錯誤等級不符的情況下不顯示錯誤詳情
0x04、現網如何合理處理500
500錯誤發生已經說明PHP腳本無法正常運作了,這時候能做的只是捕獲異常並記錄異常到日誌,以方便日後的調試和現網bug的處理。
PHP自帶錯誤日誌
#PHP本身已經帶了錯誤日誌的記錄,可以在php.ini中將log_errors項目設定為On,並配合error_log配置項目來指定錯誤日誌的存放路徑。
錯誤日誌記錄開關
日誌路徑設定
該錯誤日誌的寫入不受display_errors的配置的控制。也就是說不管display_errors是否開啟,錯誤都會記錄到日誌中。但是卻受error_reporting配置的控制,如果目前錯誤等級跟error_reporting中的錯誤等級不符的話,錯誤不會寫入日誌中。也就是如果錯誤等級是E_ERROR,但是設定卻為error_reporting(E_NOTICE),那麼日誌中不會出現E_ERROR的出錯訊息。
PHP錯誤日誌記錄各種類型的錯誤
錯誤等級不符合導致的日誌不寫入
捕獲錯誤異常記錄
PHP提供了set_error_handler、register_shutdown_function、set_exception_handler、error_get_last等相關的錯誤處理函數。可以透過函數將捕獲到的錯誤訊息寫入指定日誌來實現錯誤的記錄。
函數的使用詳情可以參考http://km.oa.com/group/19368/articles/show/302491,這裡提供一個模版:
$previousHandler = set_exception_handler(function(Exception $ex) use (&$previousHandler) { call_user_func('exceptionHandler', $ex, $previousHandler); }); set_error_handler('errorHandler'); register_shutdown_function('fatalErrorHandler'); function exceptionHandler(Exception $ex, $previousHandler) { $info = array( $ex->getFile(), $ex->getLine(), $ex->getCode(), $ex->getMessage() ); // 记录日志 logPHPError($info); if (isset($previousHandler) && is_callable($previousHandler)) { call_user_func($previousHandler, $ex); } } /** * 框架错误处理函数 * @param $errno * @param $errstr * @param $errfile * @param $errline * @return bool */ function errorHandler($errno = 0, $errstr = '', $errfile = '', $errline = 0) { switch ($errno) { case E_WARNING: $errname = 'E_WARNING'; break; case E_NOTICE: $errname = 'E_NOTICE'; break; case E_STRICT: $errname = 'E_STRICT'; break; case E_RECOVERABLE_ERROR: $errname = 'E_RECOVERABLE_ERROR'; break; case E_DEPRECATED: $errname = 'E_DEPRECATED'; break; case E_USER_ERROR: $errname = 'E_USER_ERROR'; break; case E_USER_WARNING: $errname = 'E_USER_WARNING'; break; case E_USER_NOTICE: $errname = 'E_USER_NOTICE'; break; case E_USER_DEPRECATED: $errname = 'E_USER_DEPRECATED'; break; default: restore_error_handler(); return false; } // 记录日志 $info = array( $errfile, $errline, $errname, $errstr ); logPHPError($info); restore_error_handler(); return false; } /** * Fatal error错误处理 */ function fatalErrorHandler() { if (($e = error_get_last()) && $e['type'] === E_ERROR) { $info = array( $e['file'], $e['line'], 'E_ERROR', $e['message'] ); // 记录日志 logPHPError($info); } }
0x05 總結
總結起來,error_reporting是用來控制向瀏覽器或PHP錯誤日誌輸出錯誤訊息等級的函數或配置,而display_errors則是控制是否向瀏覽器輸出錯誤和警告訊息。
由於PHP的錯誤日誌是全域的,而且受到error_reporting的控制,因此建議在業務中實作自己的錯誤(例外)擷取記錄邏輯。
推薦學習:《PHP影片教學》
以上是如何解決php 500錯誤問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。
