Я сделал очень быстрый тест, после этого:
- объявление
$iterations = 10;
в начале скрипта
- с использованием
$p
, а не $i
в цикле for (вы используете $p
для доступа к элементам массива, а не $i
)
- добавление строки для отображения использованной памяти перед сбросом
Я получаю это, используя PHP 5.3.1 (сегодняшний снимок) :
328616
332176
331728
Три выхода:
- первый: начало скрипта (тот, который говорит " показывает текущее использование памяти ДО ")
- второй: тот, который я добавил перед вызовами, чтобы сбросить; сразу после окончания
for
цикла
- третий: тот, который вы положили в конец вашего скрипта.
Итак, unsets действительно провоцируют освобождение некоторой памяти, а не увеличение используемой памяти; -)
Но освобождается только довольно небольшая часть выделенной памяти ...
Теперь может возникнуть вопрос: «Что заставляет некоторую память использоваться и не освобождаться, если я вызываю unset для массивов» - на самом деле, это, вероятно, то, что вы сначала имели в виду?
Ну, я полагаю, что сброс самих массивов не заставляет PHP освобождать память, выделенную для элементов внутри массивов ...
Как и в этой заметке на неустановленной странице руководства написано (цитирование):
unset () делает то, что говорит его имя
- сбросить переменную. Это не вызывает немедленного освобождения памяти. РНР
сборщик мусора сделает это когда
смотреть подходит - намеренно, как только
эти циклы процессора не нужны,
или еще раньше сценарий
не хватает памяти, что бы ни происходило
первый.
Если вы делаете $ what = null;
тогда вы переписываете переменную
данные. Вы можете освободить память /
сокращается быстрее, но это может украсть процессор
циклы из кода, который действительно нужен
чем раньше, тем дольше
общее время выполнения.
И, на самом деле, это может выглядеть интересно; -)
Тем не менее, выполнение нескольких быстрых тестов не дает ничего интересного; Я полагаю, что мой скрипт / данные недостаточно велики, чтобы заставить PHP освободить неиспользуемую память, или что-то вроде этого ...
Примечание: если я использую gc_collect_cycles
(PHP> = 5.3) для принудительного сбора мусора после unsets, это ничего не меняет - я полагаю, это потому, что есть нет «потерянного цикла».
* Кстати: выполнение вашего кода дало мне довольно много уведомлений (например, $ p против $ i); вы разрабатываете с error_reporting, установленным для сообщения уведомлений? *