Подтвердить что ты не робот

Каков наилучший метод очистки памяти в PHP? (5.2)

У меня есть два простых вопроса. Что лучше/полезно для очистки памяти.

$var = null;

или

unset($var);

У меня есть одна функция с одним циклом. Я получаю (через несколько минут)

Fatal error: Allowed memory size of 419430400 bytes exhausted

Я устанавливаю null и unset() - каждый объект (в конце цикла), но все равно без успеха:( Я не могу узнать, что потребляет память.

А как насчет вызовов функций в цикле? Будет ли PHP выпускать все распределения в этих функциях? (После вызова)

4b9b3361

Ответ 1

Я нашел проблему.

Сначала это было вызвано xdebug профилирующими инструментами (я включил все:)) - и он потребляет много памяти.

Итак, помните: xdebug (при включении профилирования) потребляет некоторую память в процессе PHP вашего приложения

Во-вторых, я не выпустил статические элементы, используемые в вызываемых функциях.

Ответ 2

Сам PHP иногда смешивает обе концепции, но, как правило, переменная, установленная в NULL, не совпадает с переменной, которая не существует:

<?php

$foo = 'One';
$bar = 'Two';

$foo = NULL;
unset($bar);

var_dump($foo); // NULL
var_dump($bar); // Notice: Undefined variable: bar
var_dump(get_defined_vars()); // Only foo shows up: ["foo"]=> NULL

?>

Ответ 3

unset() делает именно это, он отключает переменную; но он не освобождает память сразу.

Сборщик мусора PHP фактически освободит память, ранее используемую переменными, которые теперь не установлены, но только когда они запускаются. Это может произойти раньше, когда циклы CPU активно не используются для другой работы или до того, как в противном случае script закончится нехваткой памяти... какая бы ситуация ни происходила раньше.

И помните, что unset не обязательно будет выпускать память, используемую переменной, если у вас есть другие ссылки на эту переменную. Он просто удалит ссылку и уменьшит счетчик ссылок для фактических сохраненных данных на 1.

ИЗМЕНИТЬ В то время как unset не сразу освобождает используемую память (на самом деле это делает только сборка мусора), память, которая больше не используется в качестве результата, доступна для объявления новых переменных

Ответ 4

Если вы отключили переменную, она просто помечена, поэтому в следующей сборке мусора она будет удалена. Если параметр равен нулю, данные переменной будут перезаписаны.

Возможно, см. также комментарии к руководству php: Unset Manual

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

Ответ 5

And what about function calls in cycle? Will PHP release all allocations in these functions?(after call)

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