сборка "мусора" php, в то время как выполнение сценария

У меня есть Сценарий PHP, который работает на кроне, который может занять до 15 минуты для выполнения. Равномерно у меня есть он выкладывающий memory_get_usage (), таким образом, я вижу то, что происходит. В первый раз, когда это говорит мне мое использование, я в 10 megs. Когда сценарий заканчивается, я в 114 megs!

PHP делает, это - сборка "мусора", в то время как сценарий работает? Или что происходит со всей той памятью? Есть ли что-то, что я могу сделать для принуждения сборки "мусора". Задачей, которую делает мой сценарий, является ночной импорт пары тысячи узлов в Drupal. Таким образом, это делает то же самое много времен.

Какие-либо предложения?

16
задан Icode4food 24 June 2010 в 13:15
поделиться

4 ответа

Суть в том, что вы отключите свои глобальные переменные, как только они вам не понадобятся.

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

PHP ведет счетчик ссылок для всех переменных и уничтожает их (в большинстве случаев), как только счетчик ссылок становится равным нулю. Объекты имеют один внутренний счетчик ссылок, а сами переменные (ссылки на объекты) имеют один счетчик ссылок. Когда все ссылки на объекты были уничтожены, потому что их ссылочные coutns достигли 0, сам объект будет уничтожен. Пример:

$a = new stdclass; //$a zval refcount 1, object refcount 1
$b = $a;           //$a/$b zval refcount 2, object refcount 1
//this forces the zval separation because $b isn't part of the reference set:
$c = &$a;          //$a/$c zval refcount 2 (isref), $b 1, object refcount 2
unset($c);         //$a zval refcount 1, $b 1, object refcount 2
unset($a);         //$b refcount 1, object refcount 1
unset($b);         //everything is destroyed

Но рассмотрим следующий сценарий:

class A {
    public $b;
}
class B {
    public $a;
}

$a = new A;
$b = new B;
$a->b = $b;
$b->a = $a;
unset($a); //cannot destroy object $a because $b still references it
unset($b); //cannot destroy object $b because $a still references it

В этих циклических ссылках срабатывает сборщик мусора PHP 5.3. Вы можете явно вызвать сборщик мусора с помощью gc_collect_cycles .

См. Также Основы подсчета ссылок и Циклы сбора в руководстве.

16
ответ дан 30 November 2019 в 22:01
поделиться

Сборка мусора PHP в основном является счетчиком ссылок (у него есть некоторое обнаружение цикла). Если вы сохраняете ссылки, которые все еще доступны, они легко сложатся, если нет освобожден.

Используйте unset () , чтобы освободить переменные, которые вы больше не используете. Если вы просто перезаписываете переменные (например, с помощью null), это позволит GC только уменьшить количество пространства, требуемого для этой переменной, но не настолько, насколько не задано, что фактически позволяет уничтожить указанное значение.

Вам также следует должным образом освободить все ресурсы и т. Д., Которые вы используете.

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

3
ответ дан 30 November 2019 в 22:01
поделиться

По возможности используйте unset () , чаще проверяйте используемую память. да, php выполняет сборку мусора во время выполнения при нескольких условиях. вот полезный пост на php.net.

2
ответ дан 30 November 2019 в 22:01
поделиться

Если объем памяти увеличивается настолько, вероятно, вы не освобождаете его. Вы создали утечку памяти. Сборка мусора вам не поможет, если вы не сбросите переменные, не уничтожите объекты и / или они не выйдут из области видимости.

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

1
ответ дан 30 November 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: