【问题标题】:Symfony catch PHP errors in CLI commandSymfony 在 CLI 命令中捕获 PHP 错误
【发布时间】:2020-03-24 01:52:13
【问题描述】:

我有一个 Symfony 3.2 应用程序。我创建了一个命令来运行一些后台任务。我必须知道命令何时完成,即使它导致异常或致命错误。

我的第一个想法是用try/catch 块包围我的代码。我能够将我的代码或 PHP 库中生成的异常捕获为PDO,但不能捕获核心致命错误。然后我尝试接收错误,因此我将处理程序推送到应用程序记录器。我再次拦截异常但不是致命错误。这是我将处理程序添加到记录器的方法:

$logger = $this->getContainer()->get('logger');
$handler = $this->getContainer()->get('app.bg_command_log_handler');
$logger->pushHandler(self::$handler);

这里是处理程序:

use Monolog\Handler\AbstractProcessingHandler;

class BgCommandLogHandler extends AbstractProcessingHandler
{
    protected function write(array $record)
    {
        var_dump($record);
    }
}

Symfony 版本是 3.2,PHP 是 5.6。

【问题讨论】:

  • @yivi 嗨,对不起,我离开了几天。

标签: php symfony error-handling symfony-3.2


【解决方案1】:

您可以使用set_error_handler() 设置自定义错误处理程序,如here 所述。

当出现错误时,使用您的错误处理程序来处理throw() 异常。这样一来,任何可能引发致命错误的东西都会抛出您选择的异常,而您可以捕获它。

当然,这会影响您的整个应用程序,而不仅仅是这个特定的命令。但我认为这是一件好事。

顺便说一句,如果可能的话,您真的应该尝试升级您的 PHP 运行时。 5.6 很久不支持了。

【讨论】:

  • 我可以想象这会起作用,但是 Symfony 不是已经这样做了吗?它不会将 PHP 错误转换为异常吗?
  • 我最近的版本。您使用的是古老的堆栈,所以我不确定。但如果你说你没有捕捉到异常,我会说并不是所有的都被转换了。为什么不试试我的建议,看看它是否有效?
  • “古代”? :) 是不是有点夸张 :) 但是是的,我设置了一个自定义 set_error_handler 并且正如预期的那样,一切都会报告给我。
  • 嗯,Sf 3.2 已经发布了 3 年,距离上一个安全补丁已经快两年了。 PHP 5.6 的情况类似。我感觉到你的痛苦,处理一个难以升级的堆栈并不好。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2020-10-11
  • 2011-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
相关资源
最近更新 更多