prod 环境中未捕获 500 错误

500 errors are not caught in prod environment

我在 symfony 5.3.10 应用程序中遇到了一个奇怪的问题,我无法解决这个问题。

如果我触发 500 错误,像这样:

/**
 * @Route("/", name="pvr_index", methods={"GET"})
 */
public function index(): Response
{
    echo $a;

未定义 $a 的地方,在开发环境中我得到一个很好的错误页面。

我希望在产品中我会得到一个 不太好 错误页面,它只是告诉我我有一个 500 错误。直到前一段时间,某些东西 发生了变化,但我不知道是什么。

现在我没有得到任何错误,甚至在 symfony 服务器控制台中也没有,并且脚本执行将像什么都没发生一样继续进行。

我试过的:

在 try/catch:

中添加假定的异常
try {
        echo $a;
    }
    catch (\Exception $e)
    {
        dump($e);
        die();
    }

没有任何反应,没有触发捕获。


创建异常侦听器:

services.yaml 我有:

exception_listener:
    class: App\Event\ExceptionListener
    tags:
        - { name: kernel.event_listener, event: kernel.exception }

ExceptionListener.php 我有:

class ExceptionListener
{
    public function __construct(Environment $engine) {
        $this->engine = $engine;
    }
    public function onKernelException(ExceptionEvent $event)
    {
        dd($event->getThrowable()->getMessage());
    }
}

仍然没有任何反应,没有触发侦听器。

在开发环境中一切正常,问题只出现在生产环境中。

查看 phpinfo(); 页面,我看到启用了错误报告,所以我认为问题出在 symfony 配置上。

我正在使用 php 7.4 并且无法真正访问 php.ini 文件

这不是 Symfony 错误(也不是 PHP 错误)。

在 PHP 7.4 上,尝试输出未定义的变量只会引发 通知,而不是致命错误(代码 500)。除非您将服务器配置为记录或输出通知,否则通知会被引擎默默地吞没,您会得到类似的内容:

Notice: Undefined variable: a in file xxx.php line Y

A try/catch 不会为您做任何事情,因为 不会抛出任何异常供您捕获

Even on PHP 8 or 8.1,这只会引发 警告,例如:

Warning: Undefined variable $a

在版本<8和>=8下可以看到结果here