Tôi vẫn nhớ rất rõ lần đầu tiên tôi học về cách xử lý lỗi PHP.
Đó là năm lập trình thứ tư của tôi, năm thứ hai của tôi với PHP, và tôi đã ứng tuyển vào vị trí lập trình viên tại một công ty địa phương. Ứng dụng yêu cầu tôi gửi một mẫu mã (GitHub như chúng tôi biết lúc đó chưa tồn tại), vì vậy tôi đã nén và gửi một CMS tùy chỉnh đơn giản mà tôi đã tạo vào năm trước.
Email tôi nhận được từ người xem xét mã vẫn còn làm tôi lạnh xương sống cho đến ngày nay.
“Tôi hơi lo lắng về dự án của bạn, nhưng khi tôi tắt tính năng báo lỗi, tôi thấy nó thực sự hoạt động khá tốt”.
Đó là lần đầu tiên tôi tìm kiếm “báo cáo lỗi PHP”, khám phá cách kích hoạt nó và chết lặng khi nhìn thấy luồng lỗi đã bị ẩn khỏi tôi trước đó.
Lỗi PHP và báo cáo lỗi là điều mà nhiều nhà phát triển mới sử dụng ngôn ngữ này có thể bỏ lỡ ban đầu. Điều này là do, trên nhiều cài đặt máy chủ web dựa trên PHP, các lỗi PHP có thể bị chặn theo mặc định. Điều này có nghĩa là không ai nhìn thấy hoặc thậm chí không biết về những lỗi này.
Vì lý do này, bạn nên biết vị trí và cách kích hoạt chúng, đặc biệt là đối với môi trường phát triển cục bộ của bạn. Điều này giúp bạn sớm phát hiện lỗi trong mã của mình.
Cách hiển thị lỗi PHP
Nếu bạn Google “Lỗi PHP”, một trong những kết quả đầu tiên bạn sẽ thấy là một liên kết đến tài liệu hàm error_reporting.
Chức năng này cho phép bạn vừa đặt mức báo cáo lỗi PHP, khi tập lệnh PHP (hoặc tập lệnh) của bạn chạy hoặc truy xuất mức báo cáo lỗi PHP hiện tại, như được xác định bởi cấu hình PHP của bạn.
Các error_reporting
hàm chấp nhận một tham số duy nhất, một số nguyên, cho biết mức báo cáo nào sẽ cho phép. Không chuyển gì dưới dạng tham số chỉ trả về mức hiện tại đã đặt.
Có một danh sách dài các giá trị khả thi mà bạn có thể chuyển dưới dạng tham số, nhưng chúng ta sẽ đi sâu vào các giá trị đó sau.
Hiện tại, điều quan trọng cần biết là mỗi giá trị có thể cũng tồn tại dưới dạng hằng số được xác định trước PHP. Vì vậy, ví dụ, hằng số E_ERROR
có giá trị là 1. Điều này có nghĩa là bạn có thể vượt qua 1
hoặc E_ERROR
đến hàm error_reporting và nhận được kết quả tương tự.
Như một ví dụ nhanh, nếu chúng ta tạo một php_error_test.php
Tập lệnh PHP, chúng ta có thể thấy mức báo cáo lỗi hiện tại được đặt, cũng như đặt nó ở mức mới.
<?php
// echo the current error reporting level
echo error_reporting();
<?php
// report all Fatal run-time errors.
echo error_reporting(1);
Cấu hình báo cáo lỗi
Sử dụng error_reporting
chức năng theo cách này thật tuyệt khi bạn chỉ muốn xem bất kỳ lỗi nào liên quan đến đoạn mã mà bạn hiện đang làm việc.
Nhưng sẽ tốt hơn nếu kiểm soát lỗi nào đang được báo cáo trong môi trường phát triển cục bộ của bạn và ghi lại chúng ở đâu đó hợp lý để có thể xem lại khi bạn viết mã. Điều này có thể được thực hiện bên trong khởi tạo PHP (hoặc php.ini
) tập tin.
Các php.ini
tệp chịu trách nhiệm định cấu hình tất cả các khía cạnh của hành vi của PHP. Trong đó, bạn có thể đặt những thứ như dung lượng bộ nhớ phân bổ cho các tập lệnh PHP, kích thước tệp tải lên cho phép và những gì error_reporting
(các) cấp độ bạn muốn cho môi trường của mình.
Nếu bạn không chắc chắn nơi của bạn php.ini
tệp được đặt, một cách để tìm hiểu là tạo tập lệnh PHP sử dụng hàm phpinfo. Hàm này sẽ xuất ra tất cả thông tin liên quan đến cài đặt PHP của bạn.
<?php
phpinfo();
Như bạn có thể thấy từ phpinfo của tôi, hiện tại của tôi php.ini
tập tin được đặt tại /etc/php/7.3/apache2/php.ini
.

Một khi bạn đã tìm thấy của bạn php.ini
tệp, hãy mở tệp đó trong trình chỉnh sửa bạn chọn và tìm kiếm phần có tên ‘Xử lý và ghi nhật ký lỗi’. Đây là nơi niềm vui bắt đầu!
Chỉ thị báo cáo lỗi
Điều đầu tiên bạn sẽ thấy trong phần đó là phần nhận xét bao gồm mô tả chi tiết về tất cả các Hằng số Cấp độ Lỗi. Điều này thật tuyệt vì sau này bạn sẽ sử dụng chúng để đặt các mức báo cáo lỗi của mình.
May mắn thay, các hằng số này cũng được ghi lại trong Hướng dẫn sử dụng PHP trực tuyến để dễ tham khảo.
Bên dưới danh sách này là danh sách thứ hai về Giá trị chung. Phần này chỉ cho bạn cách đặt một số bộ kết hợp giá trị báo cáo lỗi thường được sử dụng, bao gồm các giá trị mặc định, giá trị được đề xuất cho môi trường phát triển và các giá trị được đề xuất cho môi trường sản xuất.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
Cuối cùng, ở dưới cùng của tất cả các bình luận là giá trị hiện tại của bạn error_reporting
cấp độ. Để phát triển cục bộ, tôi khuyên bạn nên đặt nó thành E_ALL
để xem tất cả các lỗi.
error_reporting = E_ALL
Đây thường là một trong những điều đầu tiên tôi đặt ra khi thiết lập một môi trường phát triển mới. Bằng cách đó, tôi sẽ thấy bất kỳ và tất cả các lỗi được báo cáo.
Sau lệnh error_reporting, có một số lệnh bổ sung mà bạn có thể đặt. Như trước đây, tệp php.ini bao gồm các mô tả của từng lệnh, nhưng tôi sẽ mô tả ngắn gọn về những lệnh quan trọng bên dưới.
Các display_errors
lệnh cho phép bạn chuyển đổi xem PHP có xuất lỗi hay không. Tôi thường đặt tùy chọn này thành Bật, vì vậy tôi có thể thấy lỗi khi chúng xảy ra.
display_errors=On
Các display_startup_errors
cho phép chuyển đổi Bật/Tắt tương tự các lỗi có thể xảy ra trong trình tự khởi động của PHP. Đây thường là các lỗi trong cấu hình máy chủ web hoặc PHP của bạn, không phải mã cụ thể của bạn. Bạn nên Tắt tùy chọn này, trừ khi bạn đang gỡ lỗi sự cố và bạn không chắc chắn điều gì gây ra sự cố đó.
Các log_errors
chỉ thị cho PHP biết có ghi lỗi vào tệp nhật ký lỗi hay không. Điều này luôn được Bật theo mặc định và được khuyến nghị.
Phần còn lại của các lệnh có thể được để mặc định, ngoại trừ có thể error_log
chỉ thị, cho phép bạn chỉ định nơi ghi lại các lỗi, nếu log_errors
đang bật. Theo mặc định, nó sẽ ghi lại các lỗi ở bất kỳ đâu mà máy chủ web của bạn đã xác định chúng sẽ được ghi lại.
Ghi nhật ký lỗi tùy chỉnh
Tôi sử dụng máy chủ web Apache trên Ubuntu và các cấu hình máy chủ ảo dành riêng cho dự án của tôi sử dụng thông tin sau để xác định vị trí cho nhật ký lỗi.
ErrorLog ${APACHE_LOG_DIR}/project-error.log
Điều này có nghĩa là nó sẽ đăng nhập vào thư mục nhật ký Apache mặc định, đó là /var/log/apache2
dưới một tệp có tên project-error.log
. Thông thường tôi thay thế project
với tên của dự án web mà nó liên quan.
Vì vậy, tùy thuộc vào môi trường phát triển cục bộ của bạn, bạn có thể cần điều chỉnh điều này cho phù hợp với nhu cầu của mình. Ngoài ra, nếu bạn không thể thay đổi điều này ở cấp độ máy chủ web, bạn có thể đặt nó ở cấp độ php.ini
cấp đến một vị trí cụ thể.
error_log = /path/to/php.log
Điều đáng chú ý là điều này sẽ ghi lại tất cả các lỗi PHP vào tệp này và nếu bạn đang làm việc trên nhiều dự án thì điều đó có thể không lý tưởng. Tuy nhiên, luôn biết cách kiểm tra một tệp để tìm lỗi có thể phù hợp hơn với bạn, vì vậy số dặm của bạn có thể thay đổi.
Tìm và sửa các lỗi đó
Nếu gần đây bạn mới bắt đầu viết mã bằng PHP và bạn quyết định bật tính năng báo cáo lỗi, hãy sẵn sàng đối phó với hậu quả từ mã hiện tại của bạn. Bạn có thể thấy một số điều bạn không mong đợi và cần phải sửa chữa.
Tuy nhiên, ưu điểm là bây giờ bạn đã biết cách bật tất cả ở cấp độ máy chủ, bạn có thể chắc chắn rằng mình sẽ thấy những lỗi này khi chúng xảy ra và xử lý chúng trước khi người khác nhìn thấy chúng!
Ồ, và nếu bạn đang thắc mắc, thì những lỗi mà tôi đề cập ở đầu bài đăng này có liên quan đến việc tôi đã định nghĩa hằng không chính xác, bằng cách không thêm dấu ngoặc kép xung quanh tên hằng.
define(CONSTANT, 'Hello world.');
PHP cho phép (và có thể vẫn cho phép) điều này, nhưng nó sẽ kích hoạt thông báo.
Notice: Use of undefined constant CONSTANT - assumed 'CONSTANT'
Thông báo này được kích hoạt mỗi khi tôi xác định một hằng số, đối với dự án đó là khoảng 8 hoặc 9 lần. Không tuyệt vời khi ai đó nhìn thấy 8 hoặc 9 thông báo ở đầu mỗi trang…