取消设置类以清除内存

时间:2011-01-12 06:19:48

标签: php

我正在使用twitter-async库与twitter api进行交互。但是,即使我在各种unset()s之后使用gc_enable()gc_collect_cycles(),内存限制也会不断增加

在使用垃圾收集器之前,内存使用率太高了。它肯定减少了很多。但不能令人满意。

我正在运行一个for循环,用于检查数据库中的新请求并处理它们。

假设一个请求被处理,产生大约98 MB(这很好 - 考虑到我从twitter获取的数据量)的内存,并且没有更多的请求被处理,那么这98 MB的数据将永远保留,直到php达到我设置的260MB内存限制。我已经设置了monit,如果由于内存限制而崩溃,则会重新启动脚本。

经过调查,我发现该库在某些变量中保存了有关失败调用的数据等。有没有办法可以破坏整个类,它将取消所有需要大量内存的变量并保存内存?我目前只是取消设置该类的变量。

$twitterObj = new EpiTwitter();
// Do all the stuff ..
unset($twitterObj);

但内存使用情况仍然没有任何变化。

帮助!

3 个答案:

答案 0 :(得分:1)

unset只执行它所说的内容:取消设置变量。它没有立即释放它。 PHP将在以后自动执行 - 尽快意图,因为不需要那些CPU周期,或者在脚本耗尽内存之前;无论先发生什么。

要立即释放内存,您需要重写变量的数据。试试这个:

$twitterObj = null;

答案 1 :(得分:1)

如果任何其他对象继续引用$twitterObj本身或其中的一些大数据,则会发生这种情况。您可以为类定义析构函数__destruct(),以查看对象是否实际被销毁(在实际销毁时调用它)。

我还建议您使用分析器(例如xhprofxdebugZend products)来查看内存使用情况并查找内存浪费的位置。

答案 2 :(得分:1)

unset不会释放内存。它只会删除变量和对象之间的引用。垃圾收集器将在下次运行时释放内存,除非在其他位置有对该对象的其他引用。从PHP5.3开始,您可以通过调用

强制执行gc'ing

有关更详细的说明,请参阅PHP Manual on Garbage Collection