首先,我使用PHP 5.4.3。
我遇到的问题是,只要PHP文件中出现错误(例如解析错误),它就会在HTML 中显示错误消息,并且页面的HTTP状态将为200 。
我想知道的是,如果发生任何错误,如何将HTTP状态设置为500 ,并且根本不显示任何错误。
请记住,我不想为每个页面显示HTTP状态500,只有少数几个。
答案 0 :(得分:2)
您可以使用注册关闭功能。资料来源:PHP : Custom error handler - handling parse & fatal errors
ini_set('display_errors', 0);
function shutdown() {
if (!is_null(error_get_last())) {
http_response_code(500);
}
}
register_shutdown_function('shutdown');
注意,E_PARSE错误只会在注册关闭功能后包含/需要的文件中捕获。
答案 1 :(得分:1)
myninjaname的答案几乎是正确的 - 但是你不知道退出时输出缓冲区发生了什么。此外,您的代码将始终运行完成。除了立即处理情况之外,我还会使用输出缓冲和自定义error_handler,保证对浏览器的响应,这也使得更容易捕获和记录与错误相关的信息,以便您可以修复任何错误:
<?php
ob_start();
set_error_handler('whoops');
function whoops($errno, $errstr, $errfile, $errline, $errcontext)
{
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
$logged="$errno: $errstr\nin $errfile at $errline\n";
foreach($errcontext as $scoped=>$val) {
$logged.=" $scoped = $val\n";
}
$logged.="Output = " . ob_get_clean() . "\n";
// NB still buffering...
debug_print_backtrace();
$logged.="stack trace = " . ob_get_clean() . "\n";
print "whoops";
ob_end_flush();
write_log_file($logged);
exit;
}
您可以真正处理解析错误 - 当您编写和部署错误代码时会发生错误 - 您应该知道如何防止在生产系统上发生这种情况。添加更多代码以尝试解决问题是一种矛盾。
您还应该通过在ini文件中设置display_errors=0来停止显示错误(而不是报告)。
<强>更新强>
我试图捕获自定义错误处理程序发生的任何错误,但由于某些原因,人们说它不会捕获解析错误(以及其他一些错误)。
你不知道如何自己测试吗? IIRC很大程度上取决于上下文(关闭函数可以捕获包含内容中的一些解析错误)和PHP的版本。但如上所述,如果您已经到了生产系统上发生此类错误的程度,那是因为您未能正确地完成工作。
答案 2 :(得分:0)
error_reporting(0)
; header("HTTP/1.0 500 Internal Server Error");
<强>参考强>
答案 3 :(得分:0)
您只需设置响应代码:
http_response_code(500);