2017-09-12 24 views
1

我已经在一个已经在持续开发中的应用程序中偶尔发生了几个月的内存不足错误&有关于目前为止有20个用户。查明PHP内存不足错误的确切原因(...它是var_dump())

它似乎没有任何负面影响,我可以检测到,但最终我找到了罪魁祸首。

我不知道如何,但我有一个默认的404错误视图,其中奇怪的代码已找到它的方式,我不知道我是如何做到这一点。如果使用findOrFail()并且db没有找到记录,这个默认的404错误视图会被框架自动调用。当一个页面在我的应用程序中不可用时(这是应该的,因为有些内容可以发布/未发布),这个错误视图是触发的。

怪异的代码是:

<!-- <div><?php var_dump($exception); ?></div> --> 
<div class="text">{{$exception->getMessage()}}</div> 

完全不可思议,我知道。

首先,html注释,因为它是一个刀片文件,所以不适用,所以var_dump被调用,尽管被注释掉了。

所以我与此替换它:

{{ var_dump($exception) }} 

和内存不足错误(以及在浏览器500的误差)的可可靠地再现。

删除它,404视图渲染正常。

{{ dd($exception) }}替代它也能正常工作 - 我得到了一个跟踪渲染。

因此,为什么var_dump行会导致内存不足错误?

我该怎么做才能进一步调查呢?

我在Laravel 5.3

回答

1

这最有可能是因为该$exception变量的内容大。当您转储该变量时,PHP会尝试将其转换为字符串表示形式。这使用了大量的内存。

我不明白你为什么需要输出整个异常对象。你很可能只需要这条信息(你可以通过$exception->getMessage()来获取信息,其余的只是回溯和对相关对象和实例的引用)

+0

谢谢,完全同意我仍然有兴趣深入研究,如果可能的话,以改善调试技巧,想要指出它!:)有时候我会想到理查德费曼:“当我遇到问题时,我无法下车,我必须这样做!” :) – mwal

+0

你也可以看看函数[Exception :: getTraceAsString](http://php.net/manual/en/exception.gettraceasstring.php) – OptimusCrime

+0

我这样做 - 它给了我一个痕迹,但在一个比dd()更紧凑的形式。然后我用完整的堆栈跟踪检查了页面dd()返回的总文件大小。答案:2MB。有点想知道为什么会发生内存不足错误(我在php的默认128MB内存限制)。 php是否需要超过128MB的内存才能生成2MB堆栈跟踪,这是否正常?或者这是否表明还有其他奇怪的事情呢?我应该在乎吗?调查有趣吗?非常感谢。 – mwal