php - 如何显示错误但仍获得正确的 HTTP 状态?
问题描述
我在开发过程中使用带有 NGINX 1.14.0 和 PHP 8.0.9 的 Laragon Lite。
如果我故意在我的 PHP 代码中出现语法错误(;
例如,缺少 ),我会收到消息
解析错误:语法错误,意外变量“$username”在...
这是完全正常的。页面的 HTTP 状态虽然很奇怪,但它给了我一个200 OK
状态!
display_errors = Off
我可以通过在 php.ini 中设置来改变这种行为。然后我收到一个500 Internal Server Error
状态,但不再显示该消息。
我怎样才能得到消息(需要调试)但仍然有正确的状态(由 AJAX 处理)?
解决方案
我的理解是,如果您需要在发生错误时将标头响应更改为 error/500,请尝试使用以下代码:
set_error_handler("myErrorHandler");
echo $undefinedTest; //Throws a error for test
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
http_response_code(500);
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
// through to the standard PHP error handler
return false;
}
switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
exit(1);
break;
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
}
推荐阅读
- php - PHP foreach 循环正在渲染一个额外的列表项
- javascript - Express.js:简单的 Get 请求需要一段时间才能加载?
- pointers - 来自其他指针的 C 指针内容分配
- java - Collectors.groupingBy 基于嵌套的静态类属性
- python - Python:获得路径中所有父母的可迭代的优雅方法
- javascript - javascript 正则表达式如何匹配这个 'And' 'Or'
- alamofire - 你如何在 Alamofire 5 中实现 RequestAdapter?
- php - jQuery ajax 没有向 WordPress 发送 post 变量
- spring - 在 Hystrix 中 maxQueueSize 和 queueSizeRejectionThreshold 是如何工作的
- angular - 我的代码有什么问题吗?我需要通过 Angular 中使用的服务方法将 Header 组件中选择的“字符串”传递给应用程序组件