为什么Slim Framework的phpErrorHandler无效?

时间:2018-04-06 01:55:26

标签: php reporting slim slim-3

我无法让phpErrorHandler工作。我使用的是最新版本的Slim,我的服务器运行的是PHP 7.1。

use \Slim\App as App;
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

$app = new App([
    'errorHandler' => function ($c) {
        return function ($request, $response, $error) use ($c) {
            return $c['response']
                ->withStatus(500)
                ->withHeader('Content-Type', 'text/html')
                ->write('application error');
        };
    },
    'phpErrorHandler' => function ($c) {
        return function ($request, $response, $error) use ($c) {
            return $c['response']
                ->withStatus(500)
                ->withHeader('Content-Type', 'text/html')
                ->write('runtime error');
        };
    }
]);

当我从我的代码中抛出一个Exception时,会调用错误处理程序,我的输出是"应用程序错误"。但是,当我从代码中抛出错误或引入语法错误时,不会调用phpErrorHandler,并且根据我的设置,PHP会生成带有堆栈跟踪的错误消息。

我试图添加

ini_set('display_errors', 0); // do not produce the standard output when an error occurs
error_reporting(-1); // enable error reporting (is this required for Slim?)

但是我在该配置中所做的任何更改似乎都不会影响我的闭包是否被调用。

-edit -

我尝试执行一段记录到控制台的Javascript。这适用于errorHandler,而不适用于phpErrorHandler。还简单

die('oops');

在phpErrorHandler中没有做任何事情。似乎根本没有调用回调。

如果我试一试/

$app->run();

我能够发现错误。然而,这会导致一些我宁愿避免的令人讨厌的副作用。但是,这告诉我的是,它不是一个配置设置,可以防止我发现错误。

2 个答案:

答案 0 :(得分:1)

我也遇到了同样的问题,但是Slim 3文档(其中提到了phpErrorHandler功能)使我误入歧途。但是,直到3.2.0版之前,phpErrorHandler才添加到Slim中:https://github.com/slimphp/Slim/releases/tag/3.2.0

如果您使用的是Slim版本<3.2.0,请尝试升级。

答案 1 :(得分:0)

也许尝试禁用display_startup_errors

我的配置:

error_reporting(E_ALL);
ini_set("display_errors", 0);
ini_set('display_startup_errors', 0);

编辑: die('oops');也不是错误,它只会死掉/退出脚本执行,之后什么都不会执行