真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么解決php中500錯(cuò)誤問(wèn)題

這篇文章主要為大家展示了“怎么解決php中500錯(cuò)誤問(wèn)題”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么解決php中500錯(cuò)誤問(wèn)題”這篇文章吧。

成都創(chuàng)新互聯(lián)公司自2013年起,我們提供高端網(wǎng)站建設(shè)、小程序開(kāi)發(fā)、電商視覺(jué)設(shè)計(jì)、重慶APP開(kāi)發(fā)公司及網(wǎng)絡(luò)營(yíng)銷(xiāo)搜索優(yōu)化服務(wù),在傳統(tǒng)互聯(lián)網(wǎng)與移動(dòng)互聯(lián)網(wǎng)發(fā)展的背景下,我們堅(jiān)守著用標(biāo)準(zhǔn)的設(shè)計(jì)方案與技術(shù)開(kāi)發(fā)實(shí)力作基礎(chǔ),以企業(yè)及品牌的互聯(lián)網(wǎng)商業(yè)目標(biāo)為核心,為客戶(hù)打造具商業(yè)價(jià)值與用戶(hù)體驗(yàn)的互聯(lián)網(wǎng)+產(chǎn)品。

php 500錯(cuò)誤的解決辦法:1、檢查PHP腳本并修改;2、捕獲異常并記錄異常到日志;3、分析日志并處理即可。

怎么解決php中500錯(cuò)誤問(wèn)題

本文操作環(huán)境:Windows7系統(tǒng)、PHP7.1版、Dell G3電腦。

PHP與500錯(cuò)誤

PHP開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)遇到返回500錯(cuò)誤的情況,而且body體中也沒(méi)有任何調(diào)試(可用)內(nèi)容。這個(gè)時(shí)候你就需要慢慢調(diào)試了(打斷點(diǎn),開(kāi)調(diào)試模式等),但如果是現(xiàn)網(wǎng),這個(gè)錯(cuò)誤就比較讓人抓狂了,既不好打斷點(diǎn)也不能開(kāi)調(diào)試模式。但既然是錯(cuò)誤,總是會(huì)有處理方法,下面就一步步分析500的成因及處理方案。

0x01、500錯(cuò)誤

500錯(cuò)誤,也叫Internal Server Error(內(nèi)部服務(wù)錯(cuò)誤),表示服務(wù)因未知錯(cuò)誤導(dǎo)致無(wú)法處理請(qǐng)求。在PHP站點(diǎn)中一般是由PHP返回,也就是說(shuō),500錯(cuò)誤一般都是PHP腳本的錯(cuò)誤。

怎么解決php中500錯(cuò)誤問(wèn)題

php-fpm抓包500

從上圖中可以看出(Nginx+PHP-FPM架構(gòu)),在PHP調(diào)用一個(gè)不存在的類(lèi)時(shí),腳本發(fā)生錯(cuò)誤并返回500給Nginx(并且將錯(cuò)誤信息也做了返回,只不過(guò)是卸載STDERR中)。

0x02、哪些錯(cuò)誤異常會(huì)導(dǎo)致500

那么哪類(lèi)錯(cuò)誤會(huì)導(dǎo)致500錯(cuò)誤呢,PHP所有的錯(cuò)誤級(jí)別可以在PHP的官方文文檔(http://php.net/manual/zh/errorfunc.constants.php)中查詢(xún)到,而這其中錯(cuò)誤級(jí)別為E_ERROR、E_PARSE、E_RECOVERABLE_ERROR、E_USER_ERROR以及未捕獲的異常等都會(huì)導(dǎo)致500錯(cuò)誤。

怎么解決php中500錯(cuò)誤問(wèn)題

E_ERROR級(jí)別錯(cuò)誤導(dǎo)致的500

0x03、什么情況下錯(cuò)誤不會(huì)返回500

上面說(shuō)了,這個(gè)是PHP腳本的錯(cuò)誤導(dǎo)致的,但是PHP腳本有了錯(cuò)誤或異常一定會(huì)導(dǎo)致500嗎?顯然不是,即使在腳本有致命錯(cuò)誤的情況下,依舊可以返回200。

怎么解決php中500錯(cuò)誤問(wèn)題

display_errors配置選項(xiàng)

在基于python、nodejs等的web應(yīng)用中,默認(rèn)情況下,如果出現(xiàn)異常信息會(huì)被打印到控制臺(tái)(STDERR/STDOUT)中。而在基于PHP-FPM架構(gòu)的PHP中沒(méi)有控制臺(tái)可以打印,它的stderr和stdout被置為FastCGI中對(duì)應(yīng)的STRDERR和STDOUT。如果將錯(cuò)誤重定向到STDOUT中,錯(cuò)誤會(huì)直接輸出到響應(yīng)中,并且狀態(tài)碼也會(huì)置為200。這個(gè)也是display_errors選項(xiàng)所實(shí)現(xiàn)的能力。

display_errors選項(xiàng)的配置需要通過(guò)ini_set來(lái)實(shí)現(xiàn),PHP文檔中關(guān)于display_errors的配置表明該值為字符串類(lèi)型,實(shí)際使用中數(shù)字和布爾類(lèi)型也可以打開(kāi)或關(guān)閉該配置。

怎么解決php中500錯(cuò)誤問(wèn)題

error_reporting配置

display_errors控制了PHP腳本發(fā)生錯(cuò)誤時(shí)是否顯示錯(cuò)誤詳情以及是否返回錯(cuò)誤狀態(tài)碼,而error_reporting項(xiàng)則用來(lái)控制哪級(jí)別的錯(cuò)誤可以被直接打印出來(lái)。

error_reporting的設(shè)置項(xiàng)可以通過(guò)error_reporting(E_ALL)或ini_set('error_reporting', E_ALL)來(lái)配置,函數(shù)參數(shù)的詳情可以參考PHP文檔。

需要注意的是,PHP本身是有錯(cuò)誤日志的(error_log和log_errors兩個(gè)配置項(xiàng)目),若發(fā)生錯(cuò)誤,PHP會(huì)將改錯(cuò)誤寫(xiě)入錯(cuò)誤日志中,而哪些錯(cuò)誤需要被寫(xiě)入是受error_reporting項(xiàng)的控制的。

怎么解決php中500錯(cuò)誤問(wèn)題

在錯(cuò)誤級(jí)別不匹配的情況下不顯示錯(cuò)誤詳情

0x04、現(xiàn)網(wǎng)如何合理處理500

500錯(cuò)誤發(fā)生已經(jīng)說(shuō)明PHP腳本無(wú)法正常運(yùn)行了,這時(shí)候能做的只是捕獲異常并記錄異常到日志,以方便日后的調(diào)試和現(xiàn)網(wǎng)bug的處理。

PHP自帶錯(cuò)誤日志

PHP本身已經(jīng)帶了錯(cuò)誤日志的記錄,可以在php.ini中將log_errors項(xiàng)設(shè)置為On,并配合error_log配置項(xiàng)來(lái)指定錯(cuò)誤日志的存放路徑。

怎么解決php中500錯(cuò)誤問(wèn)題

錯(cuò)誤日志記錄開(kāi)關(guān)

怎么解決php中500錯(cuò)誤問(wèn)題

日志路徑設(shè)置

該錯(cuò)誤日志的的寫(xiě)入不受display_errors的配置的控制。也就是說(shuō)不管display_errors是否開(kāi)啟,錯(cuò)誤都會(huì)記錄到日志中。但是卻受error_reporting配置的控制,如果當(dāng)前錯(cuò)誤級(jí)別跟error_reporting中的錯(cuò)誤級(jí)別不匹配的話(huà),錯(cuò)誤不會(huì)寫(xiě)入日志中。即如果錯(cuò)誤級(jí)別是E_ERROR,但是設(shè)置卻為error_reporting(E_NOTICE),那么日志中不會(huì)出現(xiàn)E_ERROR的出錯(cuò)信息。

怎么解決php中500錯(cuò)誤問(wèn)題

PHP錯(cuò)誤日志記錄各種類(lèi)型的錯(cuò)誤

怎么解決php中500錯(cuò)誤問(wèn)題

錯(cuò)誤級(jí)別不匹配導(dǎo)致的日志不寫(xiě)入

捕獲錯(cuò)誤異常記錄

PHP提供了set_error_handler、register_shutdown_function、set_exception_handler、error_get_last等相關(guān)的錯(cuò)誤處理函數(shù)??梢酝ㄟ^(guò)函數(shù)將捕獲到的錯(cuò)誤信息寫(xiě)入指定日志來(lái)實(shí)現(xiàn)錯(cuò)誤的記錄。

函數(shù)的使用詳情可以參考http://km.oa.com/group/19368/articles/show/302491,這里提供一個(gè)模版:

$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);
    }
}
/**
 * 框架錯(cuò)誤處理函數(shù)
 * @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錯(cuò)誤處理
 */
function fatalErrorHandler()
{
    if (($e = error_get_last()) && $e['type'] === E_ERROR) {
        $info = array(
            $e['file'],
            $e['line'],
            'E_ERROR',
            $e['message']
        );
        // 記錄日志
        logPHPError($info);
    }
}

0x05 總結(jié)

總結(jié)起來(lái),error_reporting是用于控制向?yàn)g覽器或PHP錯(cuò)誤日志輸出錯(cuò)誤信息級(jí)別的函數(shù)或配置,而display_errors則是控制是否向?yàn)g覽器輸出錯(cuò)誤和告警信息。

由于PHP的錯(cuò)誤日志是全局的,而且受到error_reporting的控制,因此推薦在業(yè)務(wù)中實(shí)現(xiàn)自己的錯(cuò)誤(異常)捕獲記錄邏輯。

以上是“怎么解決php中500錯(cuò)誤問(wèn)題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


當(dāng)前題目:怎么解決php中500錯(cuò)誤問(wèn)題
新聞來(lái)源:http://weahome.cn/article/jjiesc.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部