這篇文章主要為大家展示了“怎么解決php中500錯誤問題”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“怎么解決php中500錯誤問題”這篇文章吧。
成都創(chuàng)新互聯(lián)公司自2013年起,我們提供高端網(wǎng)站建設(shè)、小程序開發(fā)、電商視覺設(shè)計、重慶APP開發(fā)公司及網(wǎng)絡(luò)營銷搜索優(yōu)化服務(wù),在傳統(tǒng)互聯(lián)網(wǎng)與移動互聯(lián)網(wǎng)發(fā)展的背景下,我們堅守著用標(biāo)準(zhǔn)的設(shè)計方案與技術(shù)開發(fā)實力作基礎(chǔ),以企業(yè)及品牌的互聯(lián)網(wǎng)商業(yè)目標(biāo)為核心,為客戶打造具商業(yè)價值與用戶體驗的互聯(lián)網(wǎng)+產(chǎn)品。
php 500錯誤的解決辦法:1、檢查PHP腳本并修改;2、捕獲異常并記錄異常到日志;3、分析日志并處理即可。
本文操作環(huán)境:Windows7系統(tǒng)、PHP7.1版、Dell G3電腦。
PHP與500錯誤
PHP開發(fā)過程中經(jīng)常會遇到返回500錯誤的情況,而且body體中也沒有任何調(diào)試(可用)內(nèi)容。這個時候你就需要慢慢調(diào)試了(打斷點,開調(diào)試模式等),但如果是現(xiàn)網(wǎng),這個錯誤就比較讓人抓狂了,既不好打斷點也不能開調(diào)試模式。但既然是錯誤,總是會有處理方法,下面就一步步分析500的成因及處理方案。
0x01、500錯誤
500錯誤,也叫Internal Server Error(內(nèi)部服務(wù)錯誤),表示服務(wù)因未知錯誤導(dǎo)致無法處理請求。在PHP站點中一般是由PHP返回,也就是說,500錯誤一般都是PHP腳本的錯誤。
php-fpm抓包500
從上圖中可以看出(Nginx+PHP-FPM架構(gòu)),在PHP調(diào)用一個不存在的類時,腳本發(fā)生錯誤并返回500給Nginx(并且將錯誤信息也做了返回,只不過是卸載STDERR中)。
0x02、哪些錯誤異常會導(dǎo)致500
那么哪類錯誤會導(dǎo)致500錯誤呢,PHP所有的錯誤級別可以在PHP的官方文文檔(http://php.net/manual/zh/errorfunc.constants.php)中查詢到,而這其中錯誤級別為E_ERROR、E_PARSE、E_RECOVERABLE_ERROR、E_USER_ERROR以及未捕獲的異常等都會導(dǎo)致500錯誤。
E_ERROR級別錯誤導(dǎo)致的500
0x03、什么情況下錯誤不會返回500
上面說了,這個是PHP腳本的錯誤導(dǎo)致的,但是PHP腳本有了錯誤或異常一定會導(dǎo)致500嗎?顯然不是,即使在腳本有致命錯誤的情況下,依舊可以返回200。
display_errors配置選項
在基于python、nodejs等的web應(yīng)用中,默認(rèn)情況下,如果出現(xiàn)異常信息會被打印到控制臺(STDERR/STDOUT)中。而在基于PHP-FPM架構(gòu)的PHP中沒有控制臺可以打印,它的stderr和stdout被置為FastCGI中對應(yīng)的STRDERR和STDOUT。如果將錯誤重定向到STDOUT中,錯誤會直接輸出到響應(yīng)中,并且狀態(tài)碼也會置為200。這個也是display_errors選項所實現(xiàn)的能力。
display_errors選項的配置需要通過ini_set來實現(xiàn),PHP文檔中關(guān)于display_errors的配置表明該值為字符串類型,實際使用中數(shù)字和布爾類型也可以打開或關(guān)閉該配置。
error_reporting配置
display_errors控制了PHP腳本發(fā)生錯誤時是否顯示錯誤詳情以及是否返回錯誤狀態(tài)碼,而error_reporting項則用來控制哪級別的錯誤可以被直接打印出來。
error_reporting的設(shè)置項可以通過error_reporting(E_ALL)或ini_set('error_reporting', E_ALL)來配置,函數(shù)參數(shù)的詳情可以參考PHP文檔。
需要注意的是,PHP本身是有錯誤日志的(error_log和log_errors兩個配置項目),若發(fā)生錯誤,PHP會將改錯誤寫入錯誤日志中,而哪些錯誤需要被寫入是受error_reporting項的控制的。
在錯誤級別不匹配的情況下不顯示錯誤詳情
0x04、現(xiàn)網(wǎng)如何合理處理500
500錯誤發(fā)生已經(jīng)說明PHP腳本無法正常運行了,這時候能做的只是捕獲異常并記錄異常到日志,以方便日后的調(diào)試和現(xiàn)網(wǎng)bug的處理。
PHP自帶錯誤日志
PHP本身已經(jīng)帶了錯誤日志的記錄,可以在php.ini中將log_errors項設(shè)置為On,并配合error_log配置項來指定錯誤日志的存放路徑。
錯誤日志記錄開關(guān)
日志路徑設(shè)置
該錯誤日志的的寫入不受display_errors的配置的控制。也就是說不管display_errors是否開啟,錯誤都會記錄到日志中。但是卻受error_reporting配置的控制,如果當(dāng)前錯誤級別跟error_reporting中的錯誤級別不匹配的話,錯誤不會寫入日志中。即如果錯誤級別是E_ERROR,但是設(shè)置卻為error_reporting(E_NOTICE),那么日志中不會出現(xiàn)E_ERROR的出錯信息。
PHP錯誤日志記錄各種類型的錯誤
錯誤級別不匹配導(dǎo)致的日志不寫入
捕獲錯誤異常記錄
PHP提供了set_error_handler、register_shutdown_function、set_exception_handler、error_get_last等相關(guān)的錯誤處理函數(shù)。可以通過函數(shù)將捕獲到的錯誤信息寫入指定日志來實現(xiàn)錯誤的記錄。
函數(shù)的使用詳情可以參考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); } } /** * 框架錯誤處理函數(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錯誤處理 */ 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é)起來,error_reporting是用于控制向瀏覽器或PHP錯誤日志輸出錯誤信息級別的函數(shù)或配置,而display_errors則是控制是否向瀏覽器輸出錯誤和告警信息。
由于PHP的錯誤日志是全局的,而且受到error_reporting的控制,因此推薦在業(yè)務(wù)中實現(xiàn)自己的錯誤(異常)捕獲記錄邏輯。
以上是“怎么解決php中500錯誤問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁名稱:怎么解決php中500錯誤問題
路徑分享:http://jinyejixie.com/article32/jjiesc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、全網(wǎng)營銷推廣、建站公司、微信小程序、云服務(wù)器、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)