How can I get php to return 500 upon encountering a fatal exception?

后端 未结 10 1434
孤独总比滥情好
孤独总比滥情好 2020-12-24 10:37

PHP fatal errors come back as status code 200 to the HTTP client. How can I make it return a status code 500 (Internal server error)?

相关标签:
10条回答
  • 2020-12-24 10:53

    You would have to catch the thrown error using try/catch and then use that catch block to send a header() with the 500 error.

    try {
        ...badcode...
        throw new Exception('error');
    
    } catch (Exception $e) {
    
        header("Status: 500 Server Error");
        var_dump($e->getMessage());
    }
    

    If the fatal exception is not surrounded by try {} catch blocks then you must register a global handler and use register_shutdown_function() to check for an error at script end.

    0 讨论(0)
  • 2020-12-24 10:55

    Standard PHP configuration does return 500 when error occurs! Just make sure that your display_errors = off. You can simulate it with:

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

    On production display_errors directive is off by default.

    0 讨论(0)
  • 2020-12-24 10:59

    This is exactly the problem I had yesterday and I found solution as follows:

    1) first of all, you need to catch PHP fatal errors, which is error type E_ERROR. when this error occurs, script will be stored the error and terminate execution. you can get the stored error by calling function error_get_last().

    2) before script terminated, a callback function register_shutdown_function() will always be called. so you need to register a error handler by this function to do what you want, in this case, return header 500 and a customized internal error page (optional).

    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');
    

    Note: if you want to catch custom error type, which start with E_USER*, you can use function set_error_handler() to register error handler and trigger error by function trigger_error, however, this error handler can not handle E_ERROR error type. see explanation on php.net about error handler

    0 讨论(0)
  • 2020-12-24 11:00

    Since PHP >= 5.4

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

    Please set the httpCode before echo.

    0 讨论(0)
  • 2020-12-24 11:01

    It is not possible to handle PHP E_ERROR in any way according to the PHP documentation: http://www.php.net/manual/en/function.set-error-handler.php

    Nor is is possible to handle "E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, and most of E_STRICT" according to that link.

    You CAN provide a handler for the other error, warning, and notices including E_USER_ERROR, but that's really not as useful as it sounds since this error only gets thrown intentionally by the programmer with trigger_error().

    And of course you can catch any Exception (even the ones thrown by the native PHP functions).

    I agree that this is a problem. Servers should NOT return 200 OK when application code crashes and burns.

    0 讨论(0)
  • 2020-12-24 11:02

    You can use php error handling

    http://www.w3schools.com/php/php_error.asp

    0 讨论(0)
提交回复
热议问题