在php中销毁对象

时间:2010-11-18 13:39:09

标签: php object memory garbage-collection

我正在用PHP执行一个程序并且有时会收到以下错误。这是因为创建了很多对象并且没有销毁它们或任何其他原因?

允许的内存大小为16777216字节耗尽(尝试分配19456字节) 在PHP5中销毁对象的正确方法是什么。

一些代码:

App::import('Vendor','GoogleShipping',array('file'=>'googlecheckout'.DS.'library'.DS.'googleshipping.php'));
App::import('Vendor','GoogleTax',array('file'=>'googlecheckout'.DS.'library'.DS.'googletax.php'));
class Cart{
    var $_itemname;
    var $_unit_price;
    public function Usecase($itemname,$unit_price,$url,$merchant_private_item_data)
    {
            $cart = new GoogleCart($this->_merchant_id, $this->_merchant_key, $this->_server_type,$this->_currency);
            $item_1 = new GoogleItem($this->_itemname,$this->_item_description,$this->_total_count,$this->_unit_price,$this->_merchant_private_item_data);
    }
}

4 个答案:

答案 0 :(得分:3)

由于我在很多地方使用很多APP :: import来导入cakephp中的供应商文件,因此会消耗更多内存。

我没有使用APP :: import,而是使用了require_once(),但没有发生错误。

答案 1 :(得分:2)

使用unset销毁对象的引用。当所有引用都消失后,对象将被破坏。

您还可以使用memory_get_usage函数来查看当前正在使用的大量内存。尝试使用它来找出你的内存瓶颈所在。

答案 2 :(得分:2)

如果您这样做了,例如:

for($i=0;$i<=10000;$i++)
{
    $Object = new MyObject();
    //Blah
    unset($Object);
}

你不仅使用unset 10K次创建一个10K倍的对象,这会降低你的应用程序的速度

如果迭代如此,那么你最好不要超过X量:

$array = array();
$count = 0;
for($i=0;$i<=10000;$i++)
{
    $array[$i] = new MyObject();
    //Blah
    $i++;
    if($count == 500)
    {
        unset($array,$count);
        $array = $array();
        $count = 0;
    }
}

现在你的记忆力不应达到巅峰,而且你只能使用未设置20次:)

这样你的保存表现也是如此。

答案 3 :(得分:1)

如果没有看到代码,我们无法确切地知道导致此错误的原因。它可能会创建太多的对象,但它可能很容易创建太大的数组或其他数据。

无论哪种方式,无论你正在创建什么类型的数据抛出错误,它都可能是一个失控的循环或递归函数,这是根本原因,在每次迭代时创建新数据,而不是你故意创建足够的对象来溢出那么多内存。

如果你确实需要创建足够的数据来填充那么多内存,那么你可以修改PHP.ini中的最大内存容量,但这不太可能。