【问题标题】:Yii2 not catching fatal errors when error_reporting is set设置 error_reporting 时 Yii2 未捕获致命错误
【发布时间】:2017-02-14 07:49:34
【问题描述】:

在 index.php 中将 Yii2 设置为生产模式时 -

defined('YII_DEBUG') or define('YII_DEBUG', false);
defined('YII_ENV') or define('YII_ENV', 'prod')

我有一个记录器,它可以在生产模式下正确记录错误,并在用户页面上打印出适当的错误消息,但也会在通知中显示这些错误消息(不必要地杀死页面)。 所以,我在 index.php 中设置了 error_reporting -

error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);

但这完全阻止了 Yii2 捕获错误,因此它们不会被记录,并且在出现 error_reporting 允许的任何错误时呈现空白页面。它可以防止通知杀死页面,但是当我使用 error_reporting() 时日志会退出工作

有没有 Yii2 合适的方式来做这件事?以前有人遇到过这个问题吗?感谢所有尝试的解决方案。

错误日志配置——

    $log['targets'][] = [
    'class' => 'understeam\slack\LogTarget',
    'exportInterval' => 1,
    'levels' => ['error', 'warning'],
    'except' => [
        'yii\i18n*',
        'yii\web\HttpException:404',
        'yii\web\HttpException:403',
        'yii\web\ForbiddenHttpException',
        'yii\web\NotAcceptableHttpException',
        'yii\base\InvalidRouteException'
    ],
];

以上是使用供应商包“understeam/yii2-slack”:“~0.3”

【问题讨论】:

  • 您能详细介绍一下您的记录器吗?它使用set_error_handler(),是你自己的logger还是yii2内部的logger?我有类似的问题,可能这会有所帮助stackoverflow.com/questions/35522669/…
  • 对不起,我没有包括那个。我将其添加到问题的底部。
  • 好吧,看来你需要用你自己的实现替换 yii\web\ErrorHandler 或者使用 set_error_handler() 来注册你自己的函数,这会触发 Yii::warning() 向日志发送消息.
  • 你错了,日志目标不向用户“显示”错误。你有什么奇怪的errorHandler组件配置吗?
  • @soju 同意,但是在处理遗留代码时,很难清理所有可能产生警告的内容,并更好地将它们发送到日志以进行调查而不中断页面生成。

标签: php yii2


【解决方案1】:

这对我来说很有趣,我有similar problem,我认为没有办法用内部的 Yii2 ErrorHandler 解决这个问题。所以我决定创建一个带有扩展 ErrorHandler 的package,希望能解决您的问题。

安装它:

php composer.phar require cronfy/yii2-web-errorhandler

设置错误报告以报告所有错误:

error_reporting(E_ALL);

在 yii config 中配置错误处理组件:

'components' => [
    'errorHandler' => [
        'class' => 'cronfy\yii\web\ErrorHandler',
        'typesToExceptions' => YII_DEBUG ? E_ALL : false,
        'typesToLog' => E_ALL,
    ],

    // ... other components

],

使用此配置:

  1. 在 DEBUG 模式下,所有错误都将被记录并转换为异常。
  2. 在 PRODUCTION 模式下,也会记录所有错误,但不会提供会破坏页面的异常。

【讨论】:

  • 抱歉,我还没来得及测试这个。我打算今天或明天试一试。谢谢!
猜你喜欢
  • 2019-05-22
  • 2016-10-28
  • 2019-01-11
  • 2020-01-31
  • 2019-09-21
  • 1970-01-01
  • 2020-08-22
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多