Имеет ли PHP бесплатные локальные переменные сразу после завершения функции?

Код лучше иллюстрирует то, что я спрашиваю:

function foo(){ $var = get_huge_amount_of_data(); return $var[0]; } $s = foo(); // is memory freed here for the $var variable created above? do_other_stuff(); // need memory here lol 

Значит, я знаю, что $ var в какой-то момент освобождается, но делает ли PHP это эффективно? Или мне нужно вручную отключить дорогостоящие переменные?

Solutions Collecting From Web of "Имеет ли PHP бесплатные локальные переменные сразу после завершения функции?"

Вы можете увидеть этот пример в классе, потому что вы можете «поймать» освобождение переменной в деструкторе класса:

 class a { function __destruct(){ echo "destructor<br>"; } } function b(){ // test function $c=new a(); echo 'exit from function b()<br>'; } echo "before b()<br>"; b(); echo "after b()<br>"; die(); 

Этот скрипт выводит:

 before b() exit from function b() destructor after b() 

Итак, теперь ясно, что переменные уничтожаются при выходе функции.

Да, он освобождается.

Вы можете проверить это, используя:

 function a() { $var = "Hello World"; $content = ""; for ($i = 0; $i < 10000; $i++) { $content .= $var; } print '<br>$content size:'.strlen($content); print '<br>memory in function:'.memory_get_usage(); return null; } print '<br>memory before function:'.memory_get_usage(); a(); print '<br>memory after function:'.memory_get_usage(); 

вывод:

 memory before function:273312 $content size:110000 memory in function:383520 memory after function:273352 

До того, как функция PHP использовала 273312 байт.
Прежде чем функция была закончена, мы снова проверили использование памяти, и она использовала 383520.
Мы проверили размер $ content, который составляет 110000 байт.
273312 + 110000 = 383312
Остальные 208 байт из других переменных (мы только подсчитали $ content)
После того, как функция была закончена, мы снова проверили использование памяти, и она вернулась (почти (разница в 40 байт)) так же, как и раньше.

Разница в 40 байт, вероятно, будет объявлением функций и объявлением цикла цикла.

Да, потому что $var объявляется в стеке и становится ясным, как только он выходит из сферы действия

Вы можете сослаться на этот https://stackoverflow.com/a/5971224/307157

Значит, я знаю, что $ var в какой-то момент освобождается, но делает ли PHP это эффективно? Или мне нужно вручную отключить дорогостоящие переменные?

Да, PHP делает хорошую работу. Это вопрос, о котором вам никогда не нужно думать. В вашем случае я предпочел бы думать о моменте между $var = .. и return .. , потому что это тот момент, когда вы не можете избежать потребления памяти. Вы должны попытаться найти решение, в котором вам не нужно извлекать весь набор данных через get_huge_amount_of_data() а затем выбрать один элемент, но только нужные вам данные.