Hướng dẫn dùng 500 php trong PHP

answer

58

Hướng dẫn dùng 500 php trong PHP

header("HTTP/1.1 500 Internal Server Error");

58 hữu ích 3 bình luận chia sẻ

answer

27

Hướng dẫn dùng 500 php trong PHP

Đây chính xác là vấn đề tôi gặp phải ngày hôm qua và tôi đã tìm ra giải pháp như sau:

1) trước hết, bạn cần phải bắt các lỗi nghiêm trọng của PHP, đó là loại lỗi E_ERROR. khi lỗi này xảy ra, tập lệnh sẽ được lưu trữ lỗi và chấm dứt thực thi. bạn có thể gặp lỗi được lưu trữ bằng cách gọi hàm error_get_last ().

2) trước khi tập lệnh kết thúc, một hàm gọi lại register_shutdown_ Chức năng () sẽ luôn được gọi. vì vậy bạn cần đăng ký một trình xử lý lỗi bằng chức năng này để thực hiện những gì bạn muốn, trong trường hợp này, trả về tiêu đề 500 và trang lỗi nội bộ tùy chỉnh (tùy chọn).

function my_error_handler()
{
  $last_error = error_get_last();
  if ($last_error && $last_error['type']==E_ERROR)
      {
        header("HTTP/1.1 500 Internal Server Error");
        echo '...';//html for 500 page
      }
}
register_shutdown_function('my_error_handler');

Lưu ý: nếu bạn muốn bắt loại lỗi tùy chỉnh, bắt đầu bằng E_USER *, bạn có thể sử dụng hàm set_error_handler () để đăng ký trình xử lý lỗi và lỗi kích hoạt bởi hàm trigger_error, tuy nhiên, trình xử lý lỗi này không thể xử lý loại lỗi E_ERROR. xem giải thích trên php.net về trình xử lý lỗi

27 hữu ích 2 bình luận chia sẻ

answer

7

Hướng dẫn dùng 500 php trong PHP

Tôi đã sử dụng "set_exception_handler" để xử lý các trường hợp ngoại lệ không cần thiết.

function handleException($ex) {
      error_log("Uncaught exception class=" . get_class($ex) . " message=" . $ex->getMessage() . " line=" . $ex->getLine());
      ob_end_clean(); # try to purge content sent so far
      header('HTTP/1.1 500 Internal Server Error');
      echo 'Internal error';
    }

set_exception_handler('handleException');

7 hữu ích 2 bình luận chia sẻ

answer

7

Hướng dẫn dùng 500 php trong PHP

Cấu hình tiêu chuẩn PHP không trở lại 500 khi lỗi xảy ra! Chỉ cần đảm bảo rằng display_errors = tắt. Bạn có thể mô phỏng nó bằng:

ini_set('display_errors', 0); 
noFunction();

Trên sản xuất, chỉ thị display_errors bị tắt theo mặc định.

7 hữu ích 1 bình luận chia sẻ

answer

3

Hướng dẫn dùng 500 php trong PHP

Không thể xử lý PHP E_ERROR theo bất kỳ cách nào theo tài liệu PHP: http://www.php.net/manual/en/ Chức năng.set-error-handler.php

Cũng không thể xử lý "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING và hầu hết E_STRICT" theo liên kết đó.

Bạn CÓ THỂ cung cấp một trình xử lý cho lỗi, cảnh báo và thông báo khác bao gồm cả E_USER_ERROR, nhưng điều đó thực sự không hữu ích như nó có vẻ vì lỗi này chỉ được lập trình viên cố tình ném ra với trigger_error ().

Và tất nhiên bạn có thể bắt gặp bất kỳ Ngoại lệ nào (ngay cả những Ngoại lệ do các hàm PHP gốc ném ra).

Tôi đồng ý rằng đây là một vấn đề. Máy chủ KHÔNG được trả về 200 OK khi mã ứng dụng bị treo và cháy.

3 hữu ích 1 bình luận chia sẻ

answer

2

Hướng dẫn dùng 500 php trong PHP

Vì PHP> = 5,4

http_response_code(500);
echo json_encode( [ 'success' => false , 'message' => 'Crazy thing just happened!' ]);
exit();

Vui lòng đặt Mã httpC trước đó echo.

2 hữu ích 0 bình luận chia sẻ

answer

0

Hướng dẫn dùng 500 php trong PHP

0 hữu ích 1 bình luận chia sẻ

answer

0

Hướng dẫn dùng 500 php trong PHP

Bạn sẽ phải bắt lỗi được ném ra bằng cách sử dụng try / catch và sau đó sử dụng khối catch đó để gửi tiêu đề () với lỗi 500.

try {
    ...badcode...
    throw new Exception('error');

} catch (Exception $e) {

    header("Status: 500 Server Error");
    var_dump($e->getMessage());
}

Nếu ngoại lệ nghiêm trọng không được bao quanh bởi các khối try {} catch thì bạn phải đăng ký một trình xử lý chung và sử dụng register_shutdown_function()để kiểm tra lỗi ở cuối tập lệnh.

0 hữu ích 5 bình luận chia sẻ

answer

0

Hướng dẫn dùng 500 php trong PHP

Đừng bao giờ quên đặt header("HTTP/1.1 200 OK", true, 200);làm dòng cuối cùng của bất kỳ đường dẫn thực thi nào:

//first things first:
header("HTTP/1.1 500 Internal Server Error", true, 500);


//Application code, includes, requires, etc. [...]


//somewhere something happens
//die();
throw new Exception("Uncaught exception!");


//last things last, only reached if code execution was not stopped by uncaught exception or some fatal error
header("HTTP/1.1 200 OK", true, 200);

Trong PHP 5.4bạn có thể thay thế các headerchức năng trên bằng http_response_code(200)hoặc tốt hơn nhiều http_response_code(500).

0 hữu ích 2 bình luận chia sẻ

answer

0

Hướng dẫn dùng 500 php trong PHP

Điều khó khăn khi xử lý các lỗi nghiêm trọng (lỗi biên dịch, ví dụ như thiếu dấu chấm phẩy) là tập lệnh sẽ không được thực thi, vì vậy việc đặt mã trạng thái trong tập lệnh đó sẽ không hữu ích. Tuy nhiên, khi bạn bao gồm hoặc yêu cầu một tập lệnh, tập lệnh gọi sẽ được thực thi, bất kể lỗi trong tập lệnh được bao gồm. Với điều này, tôi đi đến giải pháp này:

rock-solid-script.php:

// minimize changes to this script to keep it rock-solid
http_response_code(500); // PHP >= 5.4
require_once("script-i-want-to-guard-for-errors.php");

script-i-want-to-Guard-for-error.php:

// do all the processsing
// don't produce any output
// you might want to use output buffering

http_response_code(200); // PHP >= 5.4

// here you can produce the output

Hướng cuộc gọi của bạn đến rock-solid-script.php và bạn đã sẵn sàng.

Tôi sẽ thích nó hơn nếu đặt mã trạng thái mặc định thành 500 trong .htaccess. Điều đó có vẻ thanh lịch hơn đối với tôi nhưng tôi không thể tìm ra cách để kéo nó ra. Tôi đã thử cờ Rule RewriteRule, nhưng điều này ngăn chặn hoàn toàn việc thực thi php, vì vậy điều đó không được sử dụng.

0 hữu ích 0 bình luận chia sẻ