уничтожить объект в php - PullRequest
       31

уничтожить объект в php

1 голос
/ 18 ноября 2010

Я выполняю программу на 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 ]

3 голосов
/ 19 ноября 2010

Поскольку я использовал множество APP :: import во многих местах для импорта файлов вендора в cakephp, он потребляет больше памяти.

Вместо использования APP :: import я использовал require_once (), и ошибка не произошлапроисходит.

2 голосов
/ 18 ноября 2010

Хорошо, если вы сделали это, например:

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

вы не только создаете объект в 10К раз, но и используете unset 10К раз, что уменьшит скорость вашего приложения

лучше всего их сбрасывать на сумму 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 раз можете использовать unset:)

Таким образом, ваши характеристики сохраненияа также.

2 голосов
/ 18 ноября 2010

Используйте unset , чтобы уничтожить ссылку на ваш объект.Когда все ссылки исчезнут, объект будет уничтожен.

Вы также можете использовать функцию memory_get_usage , чтобы увидеть, сколько памяти вы используете в данный момент.Попробуйте использовать его, чтобы узнать, где находятся ваши узкие места в памяти.

1 голос
/ 18 ноября 2010

Не видя код, мы не можем точно сказать, что является причиной этой ошибки. Это может быть создание слишком большого количества объектов, но это также может быть создание слишком большого массива или других данных.

В любом случае, независимо от того, какой тип данных вы создаете и которые выдают ошибку, скорее всего, это будет циклическая или рекурсивная функция, выходящая из-под контроля, которая является основной причиной, создающей новые данные на каждой итерации, а не умышленно создание достаточного количества объектов для переполнения этой памяти.

Если вам действительно нужно создать достаточно данных, чтобы заполнить столько памяти, вы можете изменить максимальный объем памяти в PHP.ini, но это маловероятно.

...