在PHP默認的錯誤處理很簡單。 用文件名,行號和描述錯誤的消息的錯誤消息被發送到瀏覽器。
PHP錯誤處理
在創建腳本和web應用程序,錯誤處理是一個重要的組成部分。 如果您的代碼缺少錯誤檢測編碼,那麼程序看上去很不專業,可能是開放的安全隱患。
本教程包含了一些最常見的錯誤檢查PHP方法。
我們會表現出不同的錯誤處理方法:
- 簡單的" die() "語句
- 自定義錯誤和錯誤觸發器
- 錯誤報告
基本的錯誤處理:使用die()函數
第一個例子表明,打開一個文本文件的簡單腳本:
<?php
$file=fopen("welcome.txt","r");
?>
如果該文件不存在,你可能會得到這樣的錯誤:
Warning : fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2
為了防止用戶收到錯誤消息像上面的,我們測試文件是否存在之前,我們嘗試訪問它:
<?php
if(!file_exists("welcome.txt")) {
die("File not found");
}
else {
$file=fopen("welcome.txt","r");
}
?>
現在,如果文件不存在,你會得到這樣的錯誤:
File not found
上面的代碼比前面的代碼更有效,因為它使用了一個簡單的錯誤處理機制在錯誤發生後停止腳本。
然而,簡單地停止腳本並不總是正確的道路要走。 讓我們來看看用於處理錯誤的替代PHP函數。
創建自定義錯誤處理程序
創建自定義錯誤處理程序非常簡單。 我們簡單地創建一個特殊的函數在PHP中發生錯誤,可以調用。
該函數必須能夠處理至少兩個參數(錯誤級別和錯誤消息),但是可以接受最多五個參數(optionally: file, line-number, and the error context) :
句法
error_function(error_level,error_message,
error_file,error_line,error_context)
參數 | 描述 |
---|---|
error_level | 需要。 指定用戶定義的錯誤錯誤報告水平。 必須是一個值數。 請參閱下面的錯誤報告級別表 |
error_message | 需要。 指定用戶定義的錯誤的錯誤消息 |
error_file | 可選的。 指定發生錯誤的文件名 |
error_line | 可選的。 指定發生錯誤的行號 |
error_context | 可選的。 指定包含各變量的陣列,和它們的值,在使用中發生錯誤時 |
錯誤報告級別
這些錯誤報告級別是不同類型的錯誤的用戶定義的錯誤處理程序,可用於:
值 | 不變 | 描述 |
---|---|---|
2 | E_WARNING | 非致命的運行時錯誤。 腳本執行不被中斷。 |
8 | E_NOTICE | 運行時通知。 腳本發現這可能是一個錯誤,但通常運行一個腳本時,也可能發生 |
256 | E_USER_ERROR | 致命的用戶生成錯誤。 這就像使用PHP函數由程序員設置E_ERROR trigger_error() |
512 | E_USER_WARNING | 非致命的用戶生成的警告。 這就像使用PHP函數由程序員設置E_WARNING trigger_error() |
1024 | E_USER_NOTICE | 用戶生成通知。 這就像使用PHP函數由程序員設置E_NOTICE trigger_error() |
4096 | E_RECOVERABLE_ERROR | 捕獲的致命錯誤。 這是類似E_ERROR,但可以由用戶定義的處理程序捕獲(see also set_error_handler() |
8191 | E_ALL | 所有的錯誤和警告(E_STRICT became a part of E_ALL in PHP 5.4) |
現在,讓我們創建一個函數來處理錯誤:
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
上面的代碼是一個簡單的錯誤處理功能。 當它被觸發時,它會錯誤級別和錯誤消息。 它隨後輸出該錯誤水平和消息,並且終止該腳本。
現在,我們已經創建了一個錯誤處理函數,我們需要確定在何時被觸發。
設置錯誤處理程序
PHP的默認錯誤處理程序是內置的錯誤處理程序。 我們要作的腳本運行期間的默認錯誤處理程序上面的功能。
它有可能改變錯誤處理程序申請只有一些錯誤,這樣腳本可以以不同方式處理不同的錯誤。 然而,在這個例子中,我們將使用我們的自定義錯誤處理程序對所有錯誤:
set_error_handler("customError");
因為我們希望我們的自定義函數來處理所有錯誤, set_error_handler()只需要一個參數,第二個參數可以被添加到指定的錯誤級別。
例
試圖通過不存在的輸出變量測試錯誤處理程序:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
以上代碼的輸出應該是這樣的:
Error: [8] Undefined variable: test
引發錯誤
在腳本中,用戶可以輸入數據,它是有用的,當非法輸入時觸發的錯誤。 在PHP中,這是由做trigger_error()函數。
例
在這個例子中,如果發生錯誤, "test"變量大於大"1"
<?php
$test=2;
if ($test>=1)
{
trigger_error("Value must be 1 or below");
}
?>
以上代碼的輸出應該是這樣的:
Notice : Value must be 1 or below
in C:\webfolder\test.php on line 6
任何地方都可以觸發一個錯誤,你希望在一個腳本,並通過添加第二個參數,你可以指定哪些錯誤級別被觸發。
可能的錯誤類型:
- E_USER_ERROR - 致命的用戶生成運行時錯誤。 無法從恢復的錯誤。 腳本執行停止
- E_USER_WARNING - 非致命的用戶生成運行時警告。 腳本執行不被中斷。
- E_USER_NOTICE - 默認。 用戶生成的運行時間另行通知。 腳本發現這可能是一個錯誤,但通常運行一個腳本時,也可能發生
例
在這個例子中,如果一個發生E_USER_WARNING "test"變量大於大"1" 如果發生了E_USER_WARNING,我們將使用我們的自定義錯誤處理程序並結束腳本:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
以上代碼的輸出應該是這樣的:
Error: [512] Value must be 1 or below
Ending Script
現在,我們已經學會了創造我們自己的錯誤,以及如何觸發它們,讓我們來看看在錯誤日誌記錄。
錯誤記錄
默認情況下,PHP發送一個錯誤日誌服務器的日誌系統或文件,這取決於error_log配置如何在php.ini文件中設定。 通過使用error_log()函數,你可以發送錯誤日誌到指定的文件或遠程目標。
通過e-mail發送錯誤信息到自己可以的得到通知的具體錯誤的一個好方法。
通過電子郵件發送錯誤信息
在下面的例子中,我們將發送一封電子郵件,並顯示錯誤消息並結束腳本,如果發生特定的錯誤:
<?php
//error handler function
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"[email protected]","From: [email protected]");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>=1) {
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
以上代碼的輸出應該是這樣的:
Error: [512] Value must be 1 or below
Webmaster has been notified
而從上面的代碼中收到的郵件是這樣的:
Error: [512] Value must be 1 or below
這不應該與所有的錯誤使用。 常規錯誤應該使用默認的PHP記錄系統在服務器上登錄。