首頁 後端開發 PHP問題 如何解決php 500錯誤問題

如何解決php 500錯誤問題

Dec 29, 2021 am 09:30 AM
500錯誤 php

php 500錯誤的解決方法:1、檢查PHP腳本並修改;2、捕獲異常並記錄異常到日誌;3、分析日誌並處理即可。

如何解決php 500錯誤問題

本文操作環境:Windows7系統、PHP7.1版、Dell G3電腦。

如何解決php  500錯誤問題?

#PHP與500錯誤

PHP開發過程中經常會遇到返回500錯誤的情況,而且body體中也沒有任何調試(可用)內容。這時候你就需要慢慢調試了(打斷點,開調試模式等),但如果是現網,這個錯誤就比較讓人抓狂了,既不好打斷點也不能開調試模式。但既然是錯誤,總是會有處理方法,以下就一步步分析500的成因及處理方案。

0x01、500錯誤

500錯誤,也叫Internal Server Error(內部服務錯誤),表示服務因未知錯誤導致無法處理要求。在PHP站點中一般是由PHP傳回,也就是說,500錯誤一般都是PHP腳本的錯誤。

如何解決php 500錯誤問題

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錯誤。

如何解決php 500錯誤問題

E_ERROR等級錯誤所導致的500

0x03、什麼情況下錯誤不會回傳500

#上面說了,這是PHP腳本的錯誤導致的,但PHP腳本有了錯誤或異常一定會導致500嗎?顯然不是,即使在腳本有致命錯誤的情況下,依舊可以回傳200。

如何解決php 500錯誤問題

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的配置表示該值為字串類型,實際使用中數字和布林類型也可以開啟或關閉該配置。

如何解決php 500錯誤問題

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項的控制的。

如何解決php 500錯誤問題

在錯誤等級不符的情況下不顯示錯誤詳情

0x04、現網如何合理處理500

500錯誤發生已經說明PHP腳本無法正常運作了,這時候能做的只是捕獲異常並記錄異常到日誌,以方便日後的調試和現網bug的處理。


PHP自帶錯誤日誌

#PHP本身已經帶了錯誤日誌的記錄,可以在php.ini中將log_errors項目設定為On,並配合error_log配置項目來指定錯誤日誌的存放路徑。

如何解決php 500錯誤問題

錯誤日誌記錄開關

如何解決php 500錯誤問題

日誌路徑設定

該錯誤日誌的寫入不受display_errors的配置的控制。也就是說不管display_errors是否開啟,錯誤都會記錄到日誌中。但是卻受error_reporting配置的控制,如果目前錯誤等級跟error_reporting中的錯誤等級不符的話,錯誤不會寫入日誌中。也就是如果錯誤等級是E_ERROR,但是設定卻為error_reporting(E_NOTICE),那麼日誌中不會出現E_ERROR的出錯訊息。

如何解決php 500錯誤問題

PHP錯誤日誌記錄各種類型的錯誤

如何解決php 500錯誤問題

錯誤等級不符合導致的日誌不寫入

捕獲錯誤異常記錄

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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

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

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

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

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

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

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

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

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

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

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

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

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

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

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

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

See all articles