首先我使用 PHP 5.4.3。
我遇到的问题是,每当 PHP 文件中发生错误(例如解析错误)时,它会在 HTML 中显示错误消息,并且页面的 HTTP 状态将为 200。
我想知道的是,如果发生任何错误,如何将 HTTP 状态设置为 500并且根本不显示任何错误。
请记住,我不想为每个页面显示 HTTP 状态 500,只显示少数页面。
首先我使用 PHP 5.4.3。
我遇到的问题是,每当 PHP 文件中发生错误(例如解析错误)时,它会在 HTML 中显示错误消息,并且页面的 HTTP 状态将为 200。
我想知道的是,如果发生任何错误,如何将 HTTP 状态设置为 500并且根本不显示任何错误。
请记住,我不想为每个页面显示 HTTP 状态 500,只显示少数页面。
您可以使用寄存器关闭功能。来源:PHP:自定义错误处理程序 - 处理解析和致命错误
ini_set('display_errors', 0);
function shutdown() {
if (!is_null(error_get_last())) {
http_response_code(500);
}
}
register_shutdown_function('shutdown');
请注意,E_PARSE 错误只会在注册关闭功能后包含/需要的文件中被捕获。
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 的版本。但是如上所述,如果您已经到了在生产系统上发生此类错误的地步,那是因为您未能正确完成工作。
error_reporting(0)
使用;关闭错误报告header("HTTP/1.0 500 Internal Server Error");
参考
您可以简单地设置响应代码:
http_response_code(500);