Xử lý lỗi PHP
- Trang trước PHP E-mail bảo mật
- Trang tiếp theo PHP Exception
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.
- Trang trước PHP E-mail bảo mật
- Trang tiếp theo PHP Exception