搜尋
首頁後端開發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
酸與基本數據庫:差異和何時使用。酸與基本數據庫:差異和何時使用。Mar 26, 2025 pm 04:19 PM

本文比較了酸和基本數據庫模型,詳細介紹了它們的特徵和適當的用例。酸優先確定數據完整性和一致性,適合財務和電子商務應用程序,而基礎則側重於可用性和

PHP安全文件上傳:防止與文件相關的漏洞。PHP安全文件上傳:防止與文件相關的漏洞。Mar 26, 2025 pm 04:18 PM

本文討論了確保PHP文件上傳的確保,以防止諸如代碼注入之類的漏洞。它專注於文件類型驗證,安全存儲和錯誤處理以增強應用程序安全性。

PHP輸入驗證:最佳實踐。PHP輸入驗證:最佳實踐。Mar 26, 2025 pm 04:17 PM

文章討論了PHP輸入驗證以增強安全性的最佳實踐,重點是使用內置功能,白名單方法和服務器端驗證等技術。

PHP API率限制:實施策略。PHP API率限制:實施策略。Mar 26, 2025 pm 04:16 PM

本文討論了在PHP中實施API速率限制的策略,包括諸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之類的庫。它還涵蓋監視,動態調整速率限制和手

php密碼哈希:password_hash和password_verify。php密碼哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

本文討論了使用password_hash和pyspasswify在PHP中使用密碼的好處。主要論點是,這些功能通過自動鹽,強大的哈希算法和SECH來增強密碼保護

OWASP前10 php:描述並減輕常見漏洞。OWASP前10 php:描述並減輕常見漏洞。Mar 26, 2025 pm 04:13 PM

本文討論了OWASP在PHP和緩解策略中的十大漏洞。關鍵問題包括注射,驗證損壞和XSS,並提供用於監視和保護PHP應用程序的推薦工具。

PHP XSS預防:如何預防XSS。PHP XSS預防:如何預防XSS。Mar 26, 2025 pm 04:12 PM

本文討論了防止PHP中XSS攻擊的策略,專注於輸入消毒,輸出編碼以及使用安全增強的庫和框架。

PHP接口與抽像類:何時使用。PHP接口與抽像類:何時使用。Mar 26, 2025 pm 04:11 PM

本文討論了PHP中接口和抽像類的使用,重點是何時使用。界面定義了無實施的合同,適用於無關類和多重繼承。摘要類提供常見功能

See all articles

熱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

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

熱工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。