2013-10-31 94 views
0

更新我注意到,与一个特定的require_once('myobject.php')内存增加出现。这个require_once()有条件地运行。当我将if语句中的require_once()语句移出所以它一直加载时,内存增加就消失了。对我来说没有意义,但问题解决了。我不确定这实际上是一个“答案”,所以我将不予答复。这是一个php内存泄漏?

我在我页面的页脚有memory_get_usage(),每次刷新页面时,我都会看到它每次增加大约100K。我的页面加载创建了许多对象,并在完成后将其销毁。我的每个父对象都有__destruct(),它使用unset()与所有子对象。具有引用的子对象返回给父对象,它们具有__destruct()unset()这些引用。

在处理我的页面的不同部分之前和之后插入memory_get_usage()只会告诉我由于脚本的该部分而增加了多少总使用量。如何确定哪些内存丢失,并且在页面加载完成后不回收垃圾回收?我有一个全局$ _SESSION var包含对象存储用户信息,但已经验证使用strlen(序列化($对象)),该对象不增长的大小。

我认为我所看到的是内存泄漏,并且脚本结束后,php垃圾回收应该有效。任何想法如何调试?

+0

有人可以纠正我,如果我错了,但如果你有一个标准的Apache和PHP设置,PHP进程在请求完成后被销毁,所以它不会在请求之间使用内存。所以'unset()'不重要(跨请求)。对于php-fpm,这可能会有所不同,我不确定。但可能没有内存泄漏,但可能会增加一些会话文件的大小,因此下次加载时会更大。 – Matt

+0

@Matt为什么你没有发布这个答案,这将是一个很好的答案。 – Vallentin

+0

当然,我认为我的答案可以详细阐述,但我现在将其发布为起点。 – Matt

回答

2

有人可以纠正我,如果我错了,但如果你有一个标准的Apache和PHP设置,PHP进程在请求完成后被销毁,所以它不会在请求之间使用内存。

所以unset(),__destruct()等无所谓(跨越请求)。当PHP进程结束时,所有内存都将被回收。

但是很可能没有内存泄漏,但可能会增加一些会话文件的大小,所以它在下次加载时会更大。

注意:这可能是不同的php-fpm,我不知道。

+0

感谢您的意见。我注意到一个特殊的'require_once('myobject.php')'显示内存增加了。这个'require_once()'是有条件地运行的。当我将if_语句的'require_once()'语句移出来,所以它一直加载,内存增加就消失了。这有意义吗? – mseifert

+0

我不知道病情是什么。或者是每次发生内存增加,还是只有当这个未知条件满足时才会更高。 N重新加载后内存是否增加无限(N至少为10,20,100)? – Matt

+0

随着每次重新加载,增加量为80k到150k,我从未发现任何限制 - 尽管我只尝试了30次。 – mseifert