你能告诉PHP在发生错误时发送标题(如500)吗?

时间:2011-06-09 08:49:14

标签: php error-handling

在我目前的项目中,我正在使用普通的HTTP请求查询PHP,但也通过AJAX查询,我有时会返回JSON格式的数据,有时返回普通文本。发生错误时,在正常请求中,您会看到错误消息并可以对其执行某些操作。另一方面,对于AJAX请求,您无法确定是否收到错误或您想要的数据,因为它不会直接显示 - 您只是遇到麻烦,因为您的应用程序将无法再运行。

所以我想到了一个错误处理系统。我最好的想法是在发生错误时发送一个500“内部服务器错误”标题,所以在我的JS中,当我发送一个AJAX-Request时,我可以简单地检查错误并处理它。

不幸的是,PHP本身并没有发送那种标题(就像你有一个解析错误,或者你的代码出错了)。

你可以:

a)如果发生错误,请告诉PHP发送500之类的标题?或
b)使用set_error_handler发送500头,然后调用PHP常规错误处理?或
c)当发生PHP错误时,你能以任何其他方式发送错误标题吗?

5 个答案:

答案 0 :(得分:7)

我更喜欢使用Exceptions来处理错误。首先,您需要安装错误到异常的错误处理程序(http://php.net/manual/en/class.errorexception.php,示例1),然后将主应用程序代码包装在try-catch块中并发送catch部分中的适当头。例如:

try {
    $myApplication->run();
} catch(Exception $e) {
   // log or otherwise register the error
   header('HTTP/1.1 500 Internal Server Error');
}

不幸的是,这不适用于所谓的“致命错误”,处理这些你必须使用这样的愚蠢技巧

ob_start();

register_shutdown_function(function() {
    $p = ob_get_contents();
    if(preg_match('~Fatal error~', $p))
        header('HTTP/1.0 500 Internal Server Error');
});

...your code... 

答案 1 :(得分:3)

  

另一方面,使用AJAX请求   你不能确定是否收到错误   或者你想要的数据,因为它不是   直接显示 - 你刚刚遇到   麻烦,因为你的应用程序将无法正常工作   了。

是的,你可以。

当数据传输成功时,您的XHR success回调会触发。给定应用程序层逻辑错误,该数据可能是一些错误消息。您的success回调可以并且应该解析从服务器获取的数据,并确定是否存在错误。

  

所以我想到了   错误处理系统。我最好的主意是   发送500“内部服务器错误”   标题如果发生错误,所以在我的   JS,当我发送AJAX-Request时,我可以   只需检查错误的方式和   处理它。

当您的Web服务器内部出现错误时,会生成“内部服务器错误”。您的网络服务器内部没有错误;您的应用程序中存在逻辑错误。因此,手动调用此类状态代码是不合适的。

  

不幸的是PHP没有发送它   标题的类型(就像你有一个标题   解析错误或代码中的某些内容   出错了)本地。

上面有充分的理由。存在不同的类错误,并且PHP /应用程序错误不会阻止Web服务器执行其工作。 HTTP请求仍然成功(它可能不包含您希望的信息)。

考虑登录表单。当您尝试登录Facebook但意外输错密码时,您是否收到500内部服务器错误?没有。你得到一个网页,正确交付200 OK状态代码,其文字说“哎呀,你的密码错了”。

以上都说过,我现在回答你的问题。

  

a)告诉PHP发送500之类的标题   如果发生错误?或b)使用   set_error_handler发送500头   然后定期调用PHP   ErrorHandling中?或者c)你可以吗?   PHP的其他方式sen错误标题   发生错误?

在上述所有情况下,无论何时您想发送状态标头,都可以使用库header功能执行此操作。

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

你可以在错误处理程序中或任何你喜欢的地方写这个。

你不能做的是控制发生PHP解析错误时会发生什么。您的应用程序将不得不假设您已经测试了所有PHP脚本并进行了解析;这似乎不是一件难以保证的事情。

答案 2 :(得分:2)

使用header()功能。

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

http://uk.php.net/manual/en/function.header.php

答案 3 :(得分:0)

您可以使用PHP的header()函数设置返回不同的标题。

实际上,您应该只对不可恢复的服务器错误使用5xx错误 - 因此在set_error_handler中您可以检查错误级别并在需要时返回500.

对于您可以处理的错误,您可以考虑可用4xx状态代码的范围,或在返回的JSON中包含错误信息数组

答案 4 :(得分:0)

使用set_error_handler()set_exception_handler(),您可以在发生错误时运行自己的代码。

这不会捕获PHP启动错误,并且在设置错误处理程序之前解析的任何PHP代码中都没有解析错误,但所有其他错误都应该是可以捕获的。