【问题标题】:Unset ing class to clear memory取消设置类以清除内存
【发布时间】:2011-06-07 15:27:17
【问题描述】:

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

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

我正在运行一个 for 循环来检查数据库中的新请求并对其进行处理。

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

经过一番调查,我发现该库在某些变量中保存了有关失败调用等的数据。有没有一种方法可以销毁整个类来取消设置所有需要内存的变量并节省内存?我目前只是取消设置()类的变量。

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

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

救命!

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

    【讨论】:

    • 我正在尝试这个。将很快发布更新。但我有强烈的感觉,这会奏效。有想过,但自己从未尝试过。 :)
    【解决方案2】:

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

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

    $twitterObj = null;
    

    【讨论】:

    • $twitterObj = null 与 unset($twitterObj) 的作用完全相同
    • @StatM,谢谢。我不确定。我的答案的第一部分仍然有效。
    【解决方案3】:

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

    更详细的解释,见PHP Manual on Garbage Collection

    【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2016-06-16
    • 2011-10-19
    相关资源
    最近更新 更多