查明PHP内存不足错误的确切原因(…它是var_dump())

查明PHP内存不足错误的确切原因(…它是var_dump()),php,laravel,error-handling,out-of-memory,Php,Laravel,Error Handling,Out Of Memory,几个月来,我在一个持续开发的应用程序上偶尔会遇到内存不足的错误&到目前为止,该应用程序有大约20个用户 它似乎没有任何负面的回收,我可以检测到,但我终于找到了罪犯 我不知道怎么做的,但我有一个默认的404错误视图,奇怪的代码已经找到了它的方式,我不知道我是怎么做到的。如果使用findOrFail()且db未找到记录,框架将自动调用此默认404错误视图。当页面在我的应用程序中不可用时(这是应该的,因为某些内容可以发布/取消发布),将触发此错误视图 奇怪的代码是: <!-- <div&g

几个月来,我在一个持续开发的应用程序上偶尔会遇到内存不足的错误&到目前为止,该应用程序有大约20个用户

它似乎没有任何负面的回收,我可以检测到,但我终于找到了罪犯

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

奇怪的代码是:

<!-- <div><?php var_dump($exception); ?></div> -->
<div class="text">{{$exception->getMessage()}}</div>
并且可以可靠地再现内存不足错误(以及浏览器中的500错误)

移除它,404视图将呈现良好效果

{dd($exception)}
替换它也很好——我得到了跟踪的渲染

那么,为什么变量转储行会导致内存不足错误?

我应该做些什么来进一步调查这个问题?


我使用的是Laravel5.3,这很可能是因为
$exception
变量的内容很大。当您转储变量时,PHP将尝试将其转换为字符串表示形式。这会占用大量内存


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

谢谢。完全同意。如果可能的话,我仍有兴趣深入调查以提高调试技能。想解决它吗!:)在这种情况下,我会想起Richard Feynman:“当我遇到一个问题时,我就是下不去。我必须去做!”:)你可以看看我做的函数——它给了我一个跟踪,但它的形式比dd()要紧凑得多。然后,我检查了dd()返回页面的总文件大小,以及完整的堆栈跟踪。答:2MB。我有点想知道为什么会发生内存不足错误(我是php默认的128MB内存限制)。php需要超过128MB的内存来生成2MB的堆栈跟踪,这正常吗?或者这是否意味着还有其他奇怪的事情发生?我应该在乎吗?调查有趣吗?非常感谢。我在Laravel中没有调试那么多,所以我只能猜测,但是,通常发生的情况是,在stracktrace发生的地方转储整个对象,我猜这就是整个Laravel对象。这个对象很可能有组件之间的引用、雄辩的、编写器依赖关系等等。通常情况下,这些对象相互引用,创建一种递归树。当您试图输出这个结果时,PHP在试图解析递归时会耗尽内存。您可以尝试只进行
var\u转储($this);模具()也在视图中。引用:“就您的具体问题而言,Magento的许多对象包含对大量信息的引用-有时引用是循环的。PHP的var_dump和print_r函数将盲目地遵循这些循环引用,并尝试打印出所有内容。”,来源:
{{ var_dump($exception) }}