Каков наилучший метод очистки памяти в PHP?(5.2) - PullRequest
12 голосов
/ 05 августа 2010

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

$var = null;

или

unset($var);

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

Fatal error: Allowed memory size of 419430400 bytes exhausted

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

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

Ответы [ 5 ]

5 голосов
/ 05 августа 2010

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

?>
2 голосов
/ 05 августа 2010

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

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

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

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

2 голосов
/ 05 августа 2010

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

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

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

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

1 голос
/ 05 августа 2010

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

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

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

0 голосов
/ 05 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...