Xử lý lỗi PHP

Trong PHP, việc xử lý lỗi mặc định rất đơn giản. Một thông điệp sẽ được gửi đến trình duyệt, thông điệp này chứa tên tệp, số dòng và một thông điệp mô tả lỗi.

Xử lý lỗi PHP

Trong việc tạo script và ứng dụng web, xử lý lỗi là một phần quan trọng. Nếu mã của bạn thiếu mã phát hiện lỗi, chương trình sẽ trông không chuyên nghiệp và mở ra nguy cơ an toàn.

教程 này giới thiệu một số phương pháp phát hiện lỗi quan trọng nhất trong PHP.

Chúng tôi sẽ giải thích các phương pháp xử lý lỗi khác nhau:

  • Câu lệnh "die()" đơn giản
  • Lỗi tùy chỉnh và bộ kích hoạt lỗi
  • Báo cáo lỗi

Xử lý lỗi cơ bản: Sử dụng hàm die()

Ví dụ đơn giản về script mở tệp văn bản:

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

Nếu tệp không tồn tại, bạn sẽ nhận được lỗi như sau:

Cảnh báo: fopen(welcome.txt) [function.fopen]: không mở được luồng: 
Không có tệp hoặc thư mục trong C:\webfolder\test.php dưới dòng 2

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

<?php
if(!file_exists("welcome.txt"))
 {
 die("Tệp không tìm thấy");
 }
else
 {
 $file=fopen("welcome.txt","r");
 }
?>

Bây giờ, nếu tệp không tồn tại, bạn sẽ nhận được thông báo lỗi như sau:

Tệp không tìm thấy

So với mã trước đó, mã trên hiệu quả hơn vì nó sử dụng cơ chế xử lý lỗi đơn giản để dừng script sau khi có lỗi.

Nhưng, việc đơn giản là dừng脚本 không phải lúc nào cũng là cách làm hợp lý. Hãy cùng nghiên cứu các hàm PHP thay thế để xử lý lỗi.

Tạo bộ xử lý lỗi tùy chỉnh

Tạo một bộ xử lý lỗi tùy chỉnh rất đơn giản. Chúng ta chỉ cần tạo một hàm chuyên dụng để gọi khi có lỗi xảy ra trong PHP.

Hàm này phải có khả năng xử lý ít nhất hai tham số (cấp độ lỗi và thông báo lỗi), nhưng có thể chấp nhận tối đa năm tham số (tùy chọn: file, số dòng và ngữ cảnh lỗi):

Ngữ pháp

error_function(error_level, error_message,
error_file, error_line, error_context)
参數 Mô tả
error_level

Bắt buộc. Lỗi định nghĩa của người dùng quy định cấp độ báo cáo lỗi. Phải là một giá trị số.

Xem bảng dưới đây: Cấp độ báo cáo lỗi.

error_message Bắt buộc. Lỗi định nghĩa lỗi của người dùng quy định thông báo lỗi.
error_file Tùy chọn. Quy định tên tệp xảy ra lỗi.
error_line Tùy chọn. Quy định dòng số xảy ra lỗi.
error_context Tùy chọn. Quy định một mảng chứa mỗi biến được sử dụng khi xảy ra lỗi và giá trị của chúng.

Mức độ báo cáo lỗi

Mức độ báo cáo lỗi này là các loại khác nhau của lỗi mà trình xử lý lỗi dự định xử lý:

Giá trị Hằng số Mô tả
2 E_WARNING Lỗi thời gian chạy không nghiêm trọng. Không dừng việc thực thi kịch bản.
8 E_NOTICE

Thông báo thời gian chạy.

Kịch bản phát hiện có thể có lỗi xảy ra, nhưng cũng có thể xảy ra khi kịch bản chạy bình thường.

256 E_USER_ERROR Lỗi do người dùng tạo ra nghiêm trọng. Tương tự như E_ERROR được đặt bởi lập trình viên sử dụng hàm trigger_error() của PHP.
512 E_USER_WARNING Cảnh báo do người dùng tạo ra không nghiêm trọng. Tương tự như E_WARNING được đặt bởi lập trình viên sử dụng hàm trigger_error() của PHP.
1024 E_USER_NOTICE Thông báo do người dùng tạo ra. Tương tự như E_NOTICE được đặt bởi lập trình viên sử dụng hàm trigger_error() của PHP.
4096 E_RECOVERABLE_ERROR Lỗi nghiêm trọng có thể bắt được. Tương tự như E_ERROR, nhưng có thể bị trình xử lý định nghĩa bởi người dùng bắt được. (Xem set_error_handler())
8191 E_ALL

Tất cả các lỗi và cảnh báo, trừ mức độ E_STRICT.

(Trong PHP 6.0, E_STRICT là một phần của E_ALL)

Bây giờ, để tạo ra một hàm xử lý lỗi:

function customError($errno, $errstr)
 { 
 echo "<b>Lỗi:</b> [$errno] $errstr<br />";
 echo "Kết thúc vở kịch";
 die();
 }

Mã trên là một hàm xử lý lỗi đơn giản. Khi được kích hoạt, nó sẽ lấy mức độ lỗi và thông báo lỗi. Sau đó, nó sẽ xuất mức độ lỗi và thông báo, và ngừng kịch bản.

Hiện tại, chúng ta đã tạo ra một hàm xử lý lỗi, chúng ta cần xác định khi nào kích hoạt hàm này.

Set Error Handler

Trình xử lý lỗi mặc định của PHP là trình xử lý lỗi tích hợp. Chúng ta muốn chuyển đổi hàm trên thành trình xử lý lỗi mặc định trong quá trình chạy kịch bản.

Bạn có thể thay đổi trình xử lý lỗi để chỉ áp dụng cho một số lỗi, như vậy kịch bản có thể xử lý khác nhau các lỗi bằng cách khác nhau. Tuy nhiên, trong ví dụ này, chúng ta muốn sử dụng trình xử lý lỗi tùy chỉnh của mình cho tất cả các lỗi:

set_error_handler("customError");

Doanh nghiệp của chúng ta muốn hàm tùy chỉnh của mình xử lý tất cả các lỗi, vì vậy set_error_handler() chỉ cần một tham số, có thể thêm tham số thứ hai để quy định mức độ lỗi.

Mô hình

Để kiểm tra trình xử lý lỗi này, hãy thử xuất ra biến không tồn tại:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Lỗi:</b> [$errno] $errstr";
 }
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>

Kết quả đầu ra của mã trên nên tương tự như thế này:

Lỗi: [8] Biến không định nghĩa: test

Kích hoạt lỗi

Ở vị trí người dùng nhập dữ liệu trong vở kịch, khi dữ liệu nhập của người dùng không hợp lệ, việc kích hoạt lỗi rất hữu ích. Trong PHP, nhiệm vụ này được hoàn thành bởi hàm trigger_error().

Ví dụ

Trong ví dụ này, nếu biến "test" lớn hơn "1", sẽ xảy ra lỗi:

<?php
$test=2;
if ($test>1)
{
trigger_error("Giá trị phải là 1 hoặc nhỏ hơn");
}
?>

Kết quả đầu ra của mã trên nên tương tự như thế này:

Notice: Giá trị phải là 1 hoặc nhỏ hơn
trong C:\webfolder\test.php trên dòng 6

Bạn có thể kích hoạt lỗi ở bất kỳ vị trí nào trong vở kịch, thông qua tham số thứ hai, bạn có thể quy định mức độ lỗi cần kích hoạt.

Loại lỗi có thể xảy ra:

  • E_USER_ERROR - Lỗi thời gian chạy do người dùng tạo nghiêm trọng. Lỗi không thể khôi phục. Vở kịch bị gián đoạn.
  • E_USER_WARNING - Cảnh báo thời gian chạy do người dùng tạo không致命. Vở kịch không bị gián đoạn.
  • E_USER_NOTICE - Mặc định. Thông báo thời gian chạy do người dùng tạo. Vở kịch phát hiện lỗi tiềm ẩn, cũng có thể xảy ra khi vở kịch chạy bình thường.

Ví dụ

Trong ví dụ này, nếu biến "test" lớn hơn "1", sẽ xảy ra lỗi E_USER_WARNING. Nếu xảy ra E_USER_WARNING, chúng ta sẽ sử dụng trình xử lý lỗi tùy chỉnh của mình và kết thúc vở kịch:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Lỗi:</b> [$errno] $errstr<br />";
 echo "Kết thúc vở kịch";
 die();
 }
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
 {
 trigger_error("Giá trị phải là 1 hoặc dưới",E_USER_WARNING);
 }
?>

Kết quả đầu ra của mã trên nên tương tự như thế này:

Lỗi: [512] Giá trị phải là 1 hoặc dưới
Kết thúc vở kịch

Hiện tại, chúng ta đã học cách tạo lỗi của riêng mình và cách kích hoạt chúng, bây giờ chúng ta sẽ nghiên cứu về ghi lỗi.

Ghi lỗi

Mặc định, dựa trên cấu hình error_log trong php.ini, PHP sẽ gửi các bản ghi lỗi đến hệ thống ghi lỗi của máy chủ hoặc tệp.

Gửi tin nhắn lỗi đến chính bạn qua email là một cách tốt để nhận thông báo về lỗi cụ thể.

Gửi tin nhắn lỗi thông qua E-Mail

Trong ví dụ dưới đây, nếu xảy ra lỗi cụ thể, chúng tôi sẽ gửi email chứa thông báo lỗi và kết thúc vân bản:

<?php
//error handler function
function customError($errno, $errstr)
 { 
 echo "<b>Lỗi:</b> [$errno] $errstr<br />";
 echo "Quản trị viên trang web đã được thông báo";
 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("Giá trị phải là 1 hoặc dưới",E_USER_WARNING);
 }
?>

Kết quả đầu ra của mã trên nên tương tự như thế này:

Lỗi: [512] Giá trị phải là 1 hoặc dưới
Quản trị viên trang web đã được thông báo

Email nhận được từ mã trên sẽ tương tự như thế này:

Lỗi: [512] Giá trị phải là 1 hoặc dưới

Phương pháp này không phù hợp với tất cả các lỗi. Các lỗi thông thường nên được ghi lại trên máy chủ bằng cách sử dụng hệ thống ghi lại mặc định của PHP.