PHP – Error Handling

Theo mặc định khi có lỗi xảy ra, PHP sẽ thông báo lỗi file nào, dòng nào đến trình duyệt.

PHP Error Handling (Xử lý lỗi)

Khi tạo một scripts và một ứng dụng web. Xử lý lỗi là một phần quan trọng. Nếu code bạn thiếu phần này có thể trông thiếu chuyên nghiệp và dễ phát sinh vấn đề bảo mật.

Sau đây chúng ta sẽ tìm hiểu một số phương pháp kiểm tra lỗi phổ biến nhất trong PHP.

  • Dùng hàm die()
  • Custom errors và error triggers
  • Error reporting

Error Handling Cơ bản dùng hàm die()

Ví dụ dùng hàm fopen để mở một file văn bản:

<?php
$file=fopen("welcome.txt","r");
?>

Nếu tệp không tồn tại, bạn có thể gặp lỗi như sau:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2

Để người dùng tránh thông báo lỗi như thông báo ở trên, chúng ta kiểm tra xem file có tồn tại hay không trước khi chúng ta mở nó:

<?php
if(!file_exists("welcome.txt")) {
  die("File not found");
} else {
  $file=fopen("welcome.txt","r");
}
?>

Bây giờ nếu file không tồn tại bạn nhận được một lỗi như thế này:

File not found

Tạo một Custom Error Handler

Việc tạo Custom Error Handler khá đơn giản. Chúng ta chỉ cần tạo ra một function và gọi nó khi một lỗi xảy ra trong PHP.

Function này có tối thiểu 2 tham số (error level và error message) nhưng nó có thể có 5 tham số.

Cấu trúc

error_function(error_level,error_message, error_file,error_line,error_context)
Parameter Description
error_level Bắt buộc, chỉ định level lỗi, Có giá trị là số. (Xem bản dưới)
error_message Bắt buộc. Chỉ định thông báo lỗi.
error_file Tùy chọn, Chỉ định file xảy ra lỗi.
error_line Tùy chọn, Chỉ định số dòng xảy ra lỗi.
error_context Tùy chọn, Chỉ định mảng chứa mỗi biến và giá trị của nó khi xảy ra lỗi.

Error Report levels

2 E_WARNING Non-fatal run-time errors. Vẫn thực thi mã lệnh
8 E_NOTICE Run-time notices. script tìm thấy thứ gì đó có thể là lỗi, nhưng cũng có thể xảy ra khi chạy script thông thường
256 E_USER_ERROR Fatal user-generated error. Điều gì đó giống như E_ERROR được thiết lập bởi lập trình viên bằng cách sử dụng hàm trigger_error()
512 E_USER_WARNING Non-fatal user-generated warning. Điều gì đó giống như E_WARNING được thiết lập bởi lập trình viên bằng cách sử dụng hàm trigger_error()
1024 E_USER_NOTICE User-generated notice. Điều gì đó giống như E_NOTICE được thiết lập bởi lập trình viên bằng cách sử dụng hàm trigger_error()
4096 E_RECOVERABLE_ERROR Catchable fatal error. Điều này giống như một lỗi nhưng có thể bị phát hiện bởi một người dùng xác định (xem set_error_handler())
8191 E_ALL Tất cả các lỗi và cảnh báo (E_STRICT đã trở thành một phần của E_ALL trong PHP 5.4)

Bây giờ, chúng ta sẽ tạo một hàm để xử lý lỗi:

function customError($errno, $errstr) {
  echo "<b>Error:</b> [$errno] $errstr<br>";
  echo "Ending Script";
  die();
}

Đoạn mã trên là một hàm xử lý lỗi đơn giản. Khi nó được kích hoạt, nó sẽ nhận error level và error message. Sau đó nó sẽ thông báo ra và kết thúc script

Sau khi tạo function thông báo lỗi, chúng ta cần chỉ định kích hoạt nó.

Set Error Handler

Trình xử lý lỗi mặc định cho PHP là trình xử lý lỗi được tạo sẵn. Để thay đổi, chúng ta dùng set_error_handler().

set_error_handler("customError");

Hàm set_error_handler() cần 1 tham số, tham số thứ 2 không bắt buộc là error level.

Ví dụ:

Để kiểm tra kết quả, chúng ta sẽ echo ra 1 biến chưa tồn tại.

<?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);
?>

Kết quả:

Error: [8] Undefined variable: test

Trigger một Error

Hàm trigger_error() giúp tạo ra một lỗi trong PHP

Ví dụ

Trong ví dụ sau, lỗi xảy ra nếu biến “test” lớn hơn “1”:

<?php
$test=2;
if ($test>=1) {
  trigger_error("Value must be 1 or below");
}
?>

Kết quả

Notice: Value must be 1 or below
in C:\webfolder\test.php on line 6

Một lỗi có thể được tạo bất kỳ đâu trong script, bạn cũng có thêm tham số thứ 2 để chỉ định level của triggered.

  • E_USER_ERROR – Fatal user-generated run-time error. Errors that can not be recovered from. script sẽ dừng lại.
  • E_USER_WARNING – Non-fatal user-generated run-time warning. script không bị dừng.
  • E_USER_NOTICE – Mặc định. User-generated run-time notice. Script tìm thấy thứ gì đó có thể là lỗi, nhưng cũng có thể xảy ra khi chạy Script thông thường

Trong ví dụ sau E_USER_WARNING xuất hiện khi $test>=1. Nếu E_USER_WARNING xảy ra custom error handler của chúng ta sẽ thông báo lỗi và kết thúc script.

<?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);
}
?>

Kết quả

Error: [512] Value must be 1 or below
Ending Script

Error Logging

Theo mặc định, PHP sẽ gửi một bản ghi lỗi tới hệ thống logging của máy chủ hoặc một file, tùy thuộc vào cách cấu hình error_log trong file php.ini. Bằng cách dùng hàm error_log(), bạn có thể gửi nhật ký lỗi tới một file được chỉ định hoặc một điểm remote.

Gửi lỗi e-mail có thể là cách tốt để nhận được thông báo về các lỗi.

Gửi một thông báo lỗi bằng E-Mail

Trong ví dụ dưới đây, chúng ta sẽ gửi một e-mail có thông báo lỗi và kết thúc tập lệnh.

<?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,
  "someone@example.com","From: webmaster@example.com");
}

//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);
}
?>

Kết quả

Error: [512] Value must be 1 or below
Webmaster has been notified

Và 1 email được gửi đi chưa thông báo lỗi

Error: [512] Value must be 1 or below