Symfony 4 生产模式错误处理页面内存耗尽

Posted

技术标签:

【中文标题】Symfony 4 生产模式错误处理页面内存耗尽【英文标题】:Symfony 4 Production Mode ErrorHandling Pages Memory Exhausted 【发布时间】:2018-11-25 06:40:04 【问题描述】:

我在.env 中将我的项目设置为prod 模式,除了自定义错误页面之外的所有内容似乎都可以正常工作。

我有这个作为我的 404 树枝模板:

# templates/bundles/TwigBundle/Exception/error404.html.twig #
% include 'builder/layout/header.html.twig' with 'title': '404' %

<img src=" assets('img/not-found.jpeg') " class="img-responsive"
     id="error-not-found-img" />

<div class="http-error-msg-container">
    <h1>404! Page Not Found</h1>
    <p>Don't despair, go back to <a href=" path('dashboard') ">Home</a> and try again.</p>
</div>

% include 'builder/layout/footer.html.twig' %

转到一个不存在的页面(比如/dashboard/giorgoirdjfisejf)会返回一个空白页面。所以我将此添加到我的index.php 文件中:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(-1);

显示错误,我得到了这个:

致命错误:第 107 行 /var/www/solomon/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 20480 字节)

致命错误:第 1 行 /var/www/solomon/vendor/symfony/debug/Exception/OutOfMemoryException.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 32768 字节)

我不太清楚为什么这会导致错误并且无法调试。 var/log/prod.log 没有显示任何内容,我该如何解决或更好,如何调试?

更新

我的 prod/monolog.yaml 文件

monolog:
    handlers:
        main:
            type: fingers_crossed
            action_level: error
            handler: nested
            excluded_404s:
                # regex: exclude all 404 errors from the logs
                - ^/
        nested:
            type: stream
            path: "%kernel.logs_dir%/%kernel.environment%.log"
            level: debug
        console:
            type:   console
            process_psr_3_messages: false
            channels: ["!event", "!doctrine"]

这是自动生成的,我没有做任何更改

【问题讨论】:

它试图记录一些大的东西,所以它崩溃了,这就是你的 prod.log 中没有任何内容的原因。在你的本地机器上用 memory_limit -1 试试,你可以看到它是什么 什么类型的处理程序? 在你的独白配置 yaml 中,你使用什么类型的日志处理程序? 尝试将buffer_size: 200 添加到处理程序配置中 【参考方案1】:

检查 symfony 日志文件的文件权限。看起来 monolog 捕获了permission denied 异常,尝试将其写入日志并一次又一次地捕获相同的错误。

【讨论】:

忘了实际检查错误日志,dankes 这显示了实际错误,我立即解决了:)【参考方案2】:

在我的例子中,错误消息几乎相同,除了堆栈跟踪总是指向StreamHandler.php 中的第 171 行。问题是 Composer 在 Windows 上运行,生成的文件被复制到 Linux 系统。这导致使用了不正确的目录分隔符,然后 Symfony 尝试创建 /var/www/html/var\log/prod.log(包含反斜杠),这显然失败了。

因此,请务必在稍后运行应用程序的同一操作系统上运行 Composer。

【讨论】:

以上是关于Symfony 4 生产模式错误处理页面内存耗尽的主要内容,如果未能解决你的问题,请参考以下文章

为啥升级到 Symfony 4.4 后我不再看到错误预览页面?

禁用生产 Symfony 中的错误

即使在调整 php.ini 后,允许的 *** 字节内存大小也会耗尽

错误:向量内存耗尽(达到限制?)R 3.5.0 macOS

使用Symfony框架在生产服务器上登录失败(由于...无法处理身份验证请求)

使用 Symfony 框架在生产服务器上的用户登录失败(身份验证请求无法处理,因为...)