2010-08-05 27 views
7

Tôi đang phát triển một ứng dụng PHP sử dụng mã phản hồi HTTP cho giao tiếp cũng như các cơ quan phản hồi. Vì vậy, đây là một kịch bản điển hình trong các mã PHP:Làm thế nào để cho Apache gửi 500 trong trường hợp lỗi PHP?

try { 
    doSomething(); 
} 
catch (Exception $e) { 
    header('HTTP/1.1 500 Internal Server Error'); 
} 

... và mã điển hình trong khách hàng trông giống như:

switch(responseCode) { 
    case 200 : 
     // all fine 
     // .... 
    case 500 : 
     // trouble! 
} 

Đây là mát mẻ, miễn là mọi lỗi được cũng bị bắt trong Mã PHP.

Vấn đề: Nếu, vì bất kỳ lý do nào trong mã php xảy ra lỗi vô tình hoặc lỗi không thể sửa lỗi như lỗi cú pháp, Apache sẽ gửi 200 OK. Nhưng tôi không phải apache để nói 500 Lỗi máy chủ nội bộ. Có thể cho mỗi .htaccess hay như vậy.

+1

Tại sao thẻ JavaScript? –

+0

Đã từng là một khách hàng javascript trong tâm trí. Đã xóa thẻ. – hek2mgl

+0

Xin lỗi, đã cập nhật câu trả lời của tôi. –

Trả lời

2

Bạn có thể, tất nhiên, write your own error handler. Tuy nhiên, không phải tất cả các lỗi PHP đều có thể bắt được. Ví dụ: lỗi cú pháp thậm chí sẽ không cho phép mã của bạn chạy, bao gồm trình xử lý lỗi của bạn.

Để xử lý các lỗi có thể bắt được, bạn có thể sử dụng chỉ thị auto_append_fileauto_prepend_file để đặt lỗi xử lý mã của bạn.

Lỗi không thể bắt được là một vấn đề khác. Nếu PHP chạy như Fast CGI, nó sẽ tự động tạo ra một mã trạng thái 500 cho bạn. Tuy nhiên, có lẽ bạn đang chạy PHP thông qua một số SAPI khác (như mô-đun Apache). Không có ý tưởng về điều đó, xin lỗi. (Tôi sẽ báo cáo lại nếu tôi tìm thấy điều gì đó.)

+0

Cảm ơn bạn đã trả lời nhanh! Có, tôi đã viết một trình xử lý lỗi và ngoại lệ tùy chỉnh, nhưng bạn đúng, các lỗi không thể sửa lỗi là vấn đề. Tôi đang googling về điều này .. – hek2mgl

+0

Bất cứ điều gì, nó là loại không phổ biến mà loại lỗi nghiêm trọng đi sống không được chú ý, phải không? –

+0

lỗi cú pháp và các lỗi nghiêm trọng khác không thể bị bắt bởi bất kỳ trình xử lý lỗi nào – stillstanding

2

Tiêu đề phản hồi không được gửi cho đến khi PHP lặp lại byte đầu tiên của nội dung phản hồi. Bạn có thể thay đổi tiêu đề (và mã trạng thái) trong thời gian trung bình. Xin lưu ý rằng, đây là giải pháp:

Đặt tập lệnh của bạn để gửi mã phản hồi 500 ở đầu tập lệnh và 200 ở cuối. Dưới đây là ví dụ:

header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error'); 

if (rand(0, 1) == 1) { 
    die("Script terminated prematurely"); 
} 

header($_SERVER['SERVER_PROTOCOL'] . ' 200 OK'); 
echo "Success"; 

Chỉ cần đảm bảo rằng 200 mã phản hồi chỉ được đặt tại một vị trí trong mã của bạn.

Lưu ý: bạn có thể sử dụng http_response_code (PHP> = 5.4) thay vì header.

+0

Ý tưởng hay +1 + Nhưng nó vẫn sẽ gửi 200 OK nếu ví dụ một lỗi cú pháp được ném. – hek2mgl

+0

Ít nhất là trên PHP> = 5.3.19 một tập lệnh có lỗi cú pháp tạo ra 500 lỗi. Không ai muốn có một kịch bản như vậy trên một máy chủ sản xuất anyway. –

2

Ngày nay nó không còn là vấn đề - từ 5.3 PHP học cuối cùng để gửi 503 về lỗi, không phải 200

Err, có vẻ như nó là 5.2.4:

Thay đổi xử lý lỗi để gửi HTTP 500 thay vì trang trống trên các lỗi PHP.

Bạn cần phải thiết lập display_errors = off để làm cho nó hoạt

tôi có hành vi chính xác trên cửa sổ của tôi Apache 2.4 với PHP 5.4.5

+0

Tôi đã thử nghiệm với PHP 5.3.10. Ví dụ: lỗi cú pháp sẽ vẫn dẫn đến 200 OK. Trong trường hợp nào PHP sẽ gửi 503? – hek2mgl

+0

Bản cập nhật của bạn thật tuyệt vời !! Nhưng nó vẫn không làm việc cho tôi. Tôi đã thử nghiệm với PHP 5.3.10-1ubuntu3.4. Tôi đã sử dụng một trang lỗi cú pháp đơn giản ' hek2mgl

+0

@YourCommonSense của bạn, có tồn tại cách tạm thời để ghi đè hành vi 5.2.4, buộc nó hiển thị một trang trống trên các lỗi PHP không? – Pacerier

Các vấn đề liên quan