php <5.3. Сборка мусора. Значения массива должны быть установлены в null или установка массива = null потеряла все его элементы? - PullRequest
1 голос
/ 28 января 2011

, поэтому я использую php 5.2 и мне нужна некоторая сборка мусора, поскольку я имею дело с очень ограниченными ресурсами и большими наборами данных.

из моих тестов я видел, что unset ничего не делает до конца скрипта (даже если у меня заканчивается память), что немного противоречит документации, хотя я предполагаю, что я также читаюдокументы 5.3, а не документы 5.2 и документы 5.3 кажутся относительно недокументированными.

Ниже приведен пример скелета моего класса:

class foo{
private $_var;

public function __construct(){
  $this->_var = array();
  for($i = 0; $i < 10000000000; $i++){
       $this->_var[rand(1, 100000)] = 'I am string '.$i.' in the array';
  }
}

  public function myGC(){
    $this->_var = null;
  }
}

в моей функции myGC ()сделать foreach над массивом и установить для каждого элемента, с которым я сталкиваюсь, значение NULL (как я помню, что делал в C ++), или установка $ this -> _ var = NULL освободит не только указатель на массив, но и все элементы, связанные с указателем?1008 *

Ответы [ 2 ]

4 голосов
/ 28 января 2011

Достаточно установить $this->_var = NULL, это освобождает память для всего, что было установлено $this->_var.

Вы можете проверить это с помощью этого (псевдокод)

echo 'before: '.memory_get_usage().'</br>';
$Test = foo();
echo 'after class instance: '.memory_get_usage().'</br>';
$Test = foo->myGC();
echo 'after unset of _var: '.memory_get_usage().'</br>';
$Test = NULL;
echo 'after unset of object: '.memory_get_usage().'</br>';
0 голосов
/ 28 января 2011

Вы нигде не вызываете myGC (), это проблема?

Чтобы проверить предположение о том, что unset не работает, попробуйте запустить приведенный ниже пример.Если это не удастся, ваше предположение верно.Если нет - у вас есть другая ошибка.

class foo{
    private $_var;

    public function __construct(){
      $this->_var = array();
      for($i = 0; $i < 10000000000; $i++){
           $this->_var[$i] = 'I am string '.$i.' in the array';
           unset($this->_var[$i]);
      }
    }
}
$f=new foo();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...