Xử lý lỗi trong PHP là một phần quan trọng. Nếu code của bạn thiếu phần kiểm tra lỗi, chương trình của bạn sẽ không chuyên nghiệp và có thể gặp rủi ro về bảo mật.
Hướng dẫn này chứa một số phương pháp kiểm tra lỗi phổ biến nhất trong PHP.
- Sử dụng câu lệnh die().
- Lỗi trùy chỉnh và tự động kích hoạt lỗi.
- Báo cáo lỗi.
Nội dung chính
Xử lý lỗi cơ bản - Sử dụng câu lệnh die()
Ví dụ đơn giản mở file trong PHP:
<?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): failed to open stream: No such file or directory in C:\xampp\htdocs\php\xu-ly-loi-1.php on line 2
Để ngăn người dùng nhận được 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 truy cập vào nó:
<?php if(!file_exists("welcome.txt")) { die("File not found."); } else { $file=fopen("welcome.txt","r"); } ?>
Bây giờ nếu tập tin không tồn tại bạn nhận được một lỗi như thế này:
File not found.
Đoạn code trên hiệu quả hơn code trước, vì nó sử dụng cơ chế xử lý lỗi đơn giản để dừng tập lệnh sau lỗi.
Tuy nhiên, đơn giản là dừng tập lệnh không phải lúc nào cũng đúng. Chúng ta hãy xem xét các hàm PHP thay thế để xử lý lỗi khác.
Xử lý lỗi cơ bản - Lỗi trùy chỉnh
Việc tạo trình xử lý lỗi tùy chỉnh khá đơn giản. Chúng ta chỉ cần tạo ra một hàm đặc biệt có thể được gọi khi một lỗi xảy ra trong PHP.
Hàm này phải có khả năng xử lý tối thiểu hai tham số (mức 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: tệp, dòng số và ngữ cảnh lỗi):
Cú pháp:
error_function(error_level, error_message, error_file, error_line, error_context)
Parameter | Description |
---|---|
error_level | Bắt buộc. Chỉ định mức báo cáo lỗi cho lỗi do người dùng định nghĩa. Phải là một số giá trị. Xem bảng bên dưới để biết các mức báo cáo lỗi có thể xảy ra. |
error_message | Bắt buộc. Chỉ định thông báo lỗi cho lỗi do người dùng định nghĩa. |
error_file | Tùy chọn. Chỉ định tên file mà lỗi có thể xảy ra. |
error_line | Tùy chọn. Chỉ định dòng của file mà lỗi có thể xảy ra. |
error_context | Tùy chọn. Chỉ định một mảng chứa mọi biến và giá trị của chúng, được sử dụng khi lỗi xảy ra. |
Mức báo cáo lỗi
Các mức báo cáo lỗi này là các loại lỗi khác nhau mà trình xử lý lỗi do người dùng định nghĩa có thể được sử dụng cho:
Giá trị | Hằng số | Mô tả |
---|---|---|
2 | E_WARNING | Lỗi runtime không nghiêm trọng. Việc thực thi tập lệnh không bị tạm dừng. |
8 | E_NOTICE | Thông báo runtime. Tập lệnh tìm thấy thứ gì đó có thể là lỗi, nhưng cũng có thể xảy ra khi chạy tập lệnh thông thường. |
256 | E_USER_ERROR | Lỗi nghiêm trọng do người dùng tạo. Nó giống như một E_ERROR được thiết lập bởi lập trình viên bằng cách sử dụng hàm PHP trigger_error() |
512 | E_USER_WARNING | Cảnh báo không nghiêm trọng do người dùng tạo. Nó giống như một 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 | Thông báo do người dùng tạo. Nó giống như một 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 | Lỗi nghiêm trọng có thể bắt được. Nó giống như một E_ERROR nhưng có thể bị bắt bởi một người dùng xác định xử lý (xem thêm 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). |
Ví dụ, xử lý lỗi trong PHP:
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 được mức lỗi và một thông báo lỗi. Sau đó nó sẽ xuất ra mức lỗi và thông báo và chấm dứt tập lệnh.
Chúng ta đã tạo ra một hàm xử lý lỗi, chúng ta cần phải quyết định khi nào nó được kích hoạt.
Thiết lập trình xử lý lỗi
Hàm set_error_handler() được sử dụng để thiết lập trình xử lý lỗi trong PHP.
Có thể thay đổi trình xử lý lỗi chỉ áp dụng cho một số lỗi, theo cách đó, tập lệnh có thể xử lý các lỗi khác nhau theo các cách khác nhau. Tuy nhiên, trong ví dụ này, chúng ta sẽ sử dụng trình xử lý lỗi tùy chỉnh của chúng ta cho tất cả các lỗi:
set_error_handler("customError");
Trong đó: customError là tên của hàm xử lý lỗi.
Ví dụ, kiểm tra trình xử lý lỗi bằng cách in biến không tồn tại:
<?php //hàm xử lý lỗi function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr"; } //thiết lập trình xử lý lỗi set_error_handler("customError"); //kích hoạt lỗi echo($test); ?>
Kết quả:
Error: [8] Undefined variable: test
Kích hoạt một lỗi
Trong một kịch bản mà người dùng có thể nhập dữ liệu, nó rất hữu ích để kích hoạt các lỗi để xác thực các hạng mục đầu vào. Trong PHP, điều này được thực hiện bởi hàm trigger_error().
Ví dụ: Trong ví dụ này, lỗi xảy ra nếu biến "test" lớn hơn "1":
<?php $test=2; if ($test>=1) { trigger_error("test phải nhỏ hơn hoặc bằng 1."); } ?>
Kết quả:
Notice: test phải nhỏ hơn hoặc bằng 1. in C:\xampp\htdocs\php\constant1.php on line 4
Một lỗi có thể được kích hoạt bất cứ nơi nào bạn muốn trong một kịch bản, và bằng cách thêm một tham số thứ hai, bạn có thể chỉ định mức độ lỗi nào được kích hoạt.
Các loại lỗi có thể xảy ra:
- E_USER_ERROR - Lỗi runtime do người dùng tạo. Lỗi không thể phục hồi được. Thực thi tập lệnh bị tạm dừng.
- E_USER_WARNING - Cảnh báo runtime do người dùng tạo không gây chết chương trình. Việc thực thi tập lệnh không bị tạm dừng.
- E_USER_NOTICE - Mặc định. Thông báo runtime do người dùng tạo. Tập lệnh tìm thấy thứ gì đó có thể là lỗi, nhưng cũng có thể xảy ra khi chạy tập lệnh thông thường.
Ví dụ:
Trong ví dụ này, E_USER_WARNING xảy ra nếu biến "test" lớn hơn "1". 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 và kết thúc tập lệnh:
<?php //hàm xử lý lỗi function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br>"; echo "Ending Script"; die(); } //thiết lập trình xử lý lỗi set_error_handler("customError", E_USER_WARNING); //kích hoạt lỗi $test=2; if ($test>=1) { trigger_error("test phải nhỏ hơn hoặc bằng 1.", E_USER_WARNING); } ?>
Kết quả:
Error: [512] test phải nhỏ hơn hoặc bằng 1. Ending Script
Log lỗi trong PHP
Theo mặc định, PHP sẽ gửi một bản ghi lỗi tới hệ thống ghi log của máy chủ hoặc một file, tùy thuộc vào cách cấu hình error_log được đặt trong tệp php.ini. Bằng cách sử 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 đích đến từ xa.
Gửi thông báo lỗi cho chính mình bằng e-mail có thể là cách tốt để nhận được thông báo về các lỗi cụ thể.
Gửi một thông báo lỗi bằng E-Mail
Trong ví dụ dưới đây, chúng tôi sẽ gửi một e-mail có thông báo lỗi và kết thúc tập lệnh, nếu xảy ra lỗi cụ thể:
<?php //hàm xử lý lỗi 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"); } //thiết lập trình xử lý lỗi set_error_handler("customError",E_USER_WARNING); //kích hoạt lỗi $test=2; if ($test>=1) { trigger_error("test phải nhỏ hơn hoặc bằng 1.", E_USER_WARNING); } ?>
Kết quả:
Error: [512] test phải nhỏ hơn hoặc bằng 1. Webmaster has been notified
Nội dung email giống như sau:
Error: [512] test phải nhỏ hơn hoặc bằng 1.
Bạn không nên áp dụng điều này với tất cả các lỗi. Các lỗi thường xuyên phải được ghi lại trên máy chủ bằng cách sử dụng hệ thống ghi nhật ký PHP mặc định.