最新的Web開發教程
 

PHP錯誤處理


在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記錄系統在服務器上登錄。