本文目錄一覽:
PHP自定義門面以後顯示錯誤?
如果您是PHP老手,當然知道當PHP腳本出錯時發生了什麼事情。此時PHP解析器將在屏幕上給出錯誤信息,如 Fatal error: Call to undefined function on line 19 –,因此程序在此處終止。這個信息會嚇到客戶,他可能立即打電話和你進行諮詢。
幸運的是,這裡有解決辦法。PHP擁有內置工具,可以讓開發人員捕捉腳本錯誤然後將它們轉到自定義的錯誤處理器。此時則可以對處理器進行編程顯示更多關於錯誤的詳細信息。還可以將錯誤寫入文件或數據庫以採取補救措施。有時候還可以對處理器編寫程序忽略錯誤消息。
本文中,我將闡述如何使用PHP的錯誤處理API構建用戶自定義的錯誤處理器,並且說明如何以簡單而友好的方式顯示和管理腳本的錯誤信息。
錯誤類型和報告級別
我們從最基本的開始。PHP有三種最基本的錯誤類型,從低級到高級分別為:注意、警告和錯誤(或致命錯誤)。通常情況下,注意和警告不會終止程序;但是致命錯誤則是危險故障(例如,調用一個沒有定義的函數或參考一個不存在的對象),將導致程序中斷。這些錯誤有可能在啟動、解析、編譯或運行時發生。
關鍵字如E_NOTICE, E_ERROR等用於表明錯誤的不同類型和等級。在PHP手冊上可以獲得它們的詳細信息列表。
腳本階段錯誤顯示由error_reporting()函數進行控制。這一函數針對不同的錯誤等級設置不同的參數。表A給出了使用此函數報告警告和致命錯誤的腳本程序。
表A
?php
// display warnings and errors
error_reporting(E_WARNING | E_ERROR);
// this will generate a notice, which will never be displayed
echo $undefinedVar;
// this will generate a fatal error, which will be displayed
callUndefFunc();
?
將表B中的代碼與上面的進行比較發現,Listing B中隱藏錯誤信息甚至隱藏致命信息,使得錯誤信息不會被顯示出來。
表B
?php
// turn off error display
// no errors will be displayed
error_reporting(0);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?
表C中的代碼將所有錯誤信息甚至簡單的注意事項都顯示出來:
表C
?php
// all errors will be displayed
error_reporting(E_ALL);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?
如以上3個例子所示,error_reporting()函數在控制錯誤發生時,在屏幕上顯示內容非常重要。這裡的關鍵字是displayed,其表達的意思是錯誤不被顯示而不是錯誤沒有發生。因此,發生致命錯誤時(例如不正確的函數調用),程序將被終止;但是,此時沒有任何消息顯示給用戶。
下面的例子(表 D)說明了這種情況:
表D
?php
// no errors will be displayed
error_reporting(0);
// start a task
echo “Starting task…”;
// call an undefined function
// a fatal error occurs during task processing
callMe();
// end the task
echo “Successfully completed task…”;
?
在表D中,在調用echo()函數時發生了致命錯誤,程序執行時到這點被終止,但是卻沒有任何錯誤消息給出,用戶不知道這種情況還以為程序在正確運行。下面的結論是非常明顯的:不給出錯誤報告非常危險,因為不論過程是否完成它常導致不正確的結論。
注意:調用不帶任何參數的error_reporting()將返回當前的錯誤報告等級。
自定義錯誤處理器
很明顯,隱藏錯誤報告是不正確的,你肯定想知道有什麼其他辦法加以改進。自定義錯誤處理器就是一個很好的能取代PHP默認錯誤處理系統的解決方法。自定義錯誤處理器可以以任何方式設置處理錯誤信息,包括信息如何顯示。
PHP函數中,完成這一功能的是set_error_handler()函數。錯誤發生時,此函數被自動調用,然後給出4個參數:錯誤代碼、錯誤消息、發生錯誤的腳本名稱和錯誤出現的行,此函數對錯誤管理負責。
表E給出一個簡單例子:
表E
?php
// define custom handler
set_error_handler(‘myHandler’);
// custom handler code
function myHandler($code, $msg, $file, $line) {
echo “Just so you know, something went wrong at line $line of your script $file. The system says that the error code was $code, and the reason for the error was: $msg. Sorry about this!”;
}
// generate a notice
echo $undefVar;
?
當運行此腳本的時候,會出現下面的信息:
Just so you know, something went wrong at line 11 of your /dev/error1.php. The system says that the error code was 8, and the reason for the error was: Undefined variable: undefVar. Sorry about this!
此時,PHP的默認錯誤處理器被用戶定義的myHandler()函數所取代,$undefVar變量被激活,PHP通知未定義變量的信息,此信息在運行時引擎產生,然後傳遞給myHandler()函數,同時錯誤發生的地址也傳遞給此函數。然後myHandler()函數輸出友好信息解釋錯誤。
注意:錯誤和致命錯誤很重要,它們會繞過自定義錯誤處理器,然後以PHP默認的錯誤處理機制進行顯示。顯示這些信息可使用前面討論的標準error_reporting()函數進行控制。
例1:動態錯誤頁面和e-mail警報
表F給出了另一個範例,當發生錯誤時,將動態產生HTML錯誤頁面,並且通過e-mail向Web管理員進行報告。
表F
?php
// define custom handler
set_error_handler(‘myHandler’);
// custom handler code
function myHandler($code, $msg, $file, $line, $context) {
// print error page
echo “htmlhead/headbody”;
echo “h2 align=centerError!/h2”;
echo “font color=red size=+1”;
echo “An error occurred while processing your request. Please visit our a href=;home page/a and try again.”;
echo “/font”;
echo “/body/html”;
// email error to admin
$body = “$msg at $file ($line), timed at ” . date (“d-M-Y h:i:s”, mktime());
$body .= “nn” . print_r($context, TRUE);
mail (“webmaster@domain.dom”, “Web site error”, $body);
// halt execution of script
die();
}
// generate a notice
echo $undefVar;
?
這裡,自定義的錯誤處理器在遇到錯誤時動態產生HTML錯誤頁面。此錯誤信息也能被e-mail信息捕獲,然後通過PHP內置的mail()函數發送給管理員。
這裡出現了myHandler()函數的一個新參數$context。這是myHandler()函數的第五個參數,是可選項。它包含了當前變量狀態的快照。包括對管理員有用的上下文信息,有利於減少調試時間。
最近PHP頁面老是提示404錯誤,怎麼找原因
【遠標老師教我們網頁上有錯誤的一般解決方法】 1、點擊“開始”菜單,打開“運行”。 2、輸入regsvr32 jscriptdll後選擇“確定”。出現提示後,點擊確定。 3、再次輸入regsvr32 vbscriptdll選擇“確定”。再一次出現提示後,確定。 4、經過以上兩次成最近PHP頁面老是提示404錯誤,怎麼找原因
PHP寫的頁面無法訪問,報HTTP500錯誤,這個是怎麼回事
原因百分之80來自於網站根目錄的config.php文件中資料庫相關設定錯誤,這種錯誤排除,只要檢查一下config.php文件中的伺服器和資料庫名稱、使用者名稱、密碼,還有資料庫前綴字串,再來就是檔案文件路徑,只要是多一個或少一個符號、大小寫錯誤、空格…絕對會賞你一個[HTTP 500 內部伺服器發生錯誤]的排頭吃。
再來百分之10的錯誤來自於網站程式碼設計錯誤也會出現[HTTP 500 內部伺服器發生錯誤]的頁面,這個錯誤一來可以從視窗工具=網際網路選項=進階=去掉勾選:顯示易懂的HTTP錯誤訊息,二來可以從網站根目錄的error_log紀錄中看出一些端倪,再來排除,還有百分之5剛好碰上訪問的網站在維護,最多的例子是網站升級和網站遷移。
將錯誤訊息顯示出來。
而顯示的方法有兩種,一種是設定php.ini;另一種是透過程式碼開啟,操作方法請參考以下:
一、設定php.ini
1.首先開啟php.ini檔
2.使用「Ctrl」+「F」搜尋【display_errors】
3.將「display_errors=Off」改為「display_errors=On」
4.重新啟動Apache
5.重啟開啟網頁
二、透過程式碼開啟
1.開啟顯示「伺服器錯誤(500)」的程式檔
2.於程式檔加入以下程式碼
ini_set(“display_errors”, “On”); // 設定是否顯示錯誤( On=顯示, Off=隱藏 )
3.重啟開啟網頁
phpDW輸出程序顯示訪問網頁出錯
服務器配置問題。
首先服務器配置問題,你可以設定一個新的indexphp只是個例子看下phpinfo能不能正常顯示出,然後程序有木有開啟debug。
如果沒打開,打開後看是不是程序不兼容問題。其他的話就只能是其他不可預知的問題了,需要逐步排查後解決。
原創文章,作者:ZRUJ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/140631.html