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

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

$var = null;

или

unset($var);

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

Fatal error: Allowed memory size of 419430400 bytes exhausted

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

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

12
задан Michal Drozd 12 August 2010 в 11:30
поделиться

5 ответов

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

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

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

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

2
ответ дан 2 December 2019 в 22:21
поделиться

Сам 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

?>
5
ответ дан 2 December 2019 в 22:21
поделиться

unset () делает именно это: отменяет установку переменной; но при этом не происходит немедленного освобождения памяти.

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

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

РЕДАКТИРОВАТЬ Хотя unset не сразу освобождает используемую память (фактически это делает только сборка мусора), память, которая больше не используется в результате, доступна для объявления новых переменных

2
ответ дан 2 December 2019 в 22:21
поделиться

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

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

0
ответ дан 2 December 2019 в 22:21
поделиться

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

См. Также комментарии к руководству по php: Руководство по отключению

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

1
ответ дан 2 December 2019 в 22:21
поделиться
Другие вопросы по тегам:

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