【发布时间】:2011-10-05 23:30:48
【问题描述】:
我有一个 php 脚本,它使用 Doctrine2 和 Zend 从数据库中计算一些东西并为 30.000 个用户发送一些电子邮件。
我的脚本正在泄漏内存,我想知道哪些对象正在消耗该内存,以及是否有可能谁在保留对它们的引用(因此不允许释放它们)。
我使用的是 php 5.3.x,所以简单的循环引用应该不是问题。
我尝试使用 xdebug 跟踪功能来获取 mem_delta,但没有成功(数据太多)。
我尝试在重要功能之前和之后手动添加 memory_get_usage。但我得到的唯一结论是,我每个用户损失了大约 400k,而 3000 个用户的时间给了我可用的 1Gb。
还有其他方法可以知道内存泄漏的位置和原因吗? 谢谢
【问题讨论】:
-
嗯,用户应该是一个接一个的处理,应该只需要400k的内存!如果每个周期都增加了内存使用量,那么您的设计中的某些地方就大错特错了!
-
好吧,我有一个循环调用一个函数,该函数执行以下操作:获取用户信息、计算(包括存储)、发送邮件、释放资源。而且每个用户都是相互独立的,所以资源显然没有被释放
-
你看过学说的 entitymanager 了吗?我对原则不是很熟悉,但它可能会为所有 30k 用户存储对实体/代理/...的引用。
-
您尝试过 xdebug 分析器吗?它应该让您很好地了解哪种方法占用的内存最多。 xdebug.org/docs/profiler
-
@Fge 在计算完每个用户后我对实体管理器做了一个清除,所以据我所知应该是去掉
标签: php zend-framework memory-leaks doctrine-orm php-5.3