我正在使用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);
但内存使用情况仍然没有任何变化。
帮助!
答案 0 :(得分:1)
unset
只执行它所说的内容:取消设置变量。它没有立即释放它。 PHP将在以后自动执行 - 尽快意图,因为不需要那些CPU周期,或者在脚本耗尽内存之前;无论先发生什么。
要立即释放内存,您需要重写变量的数据。试试这个:
$twitterObj = null;
答案 1 :(得分:1)
如果任何其他对象继续引用$twitterObj
本身或其中的一些大数据,则会发生这种情况。您可以为类定义析构函数__destruct()
,以查看对象是否实际被销毁(在实际销毁时调用它)。
我还建议您使用分析器(例如xhprof或xdebug或Zend products)来查看内存使用情况并查找内存浪费的位置。
答案 2 :(得分:1)
unset
不会释放内存。它只会删除变量和对象之间的引用。垃圾收集器将在下次运行时释放内存,除非在其他位置有对该对象的其他引用。从PHP5.3开始,您可以通过调用
有关更详细的说明,请参阅PHP Manual on Garbage Collection。