Код лучше иллюстрирует то, что я спрашиваю:
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 это эффективно? Или мне нужно вручную отключить дорогостоящие переменные?
Вы можете увидеть этот пример в классе, потому что вы можете «поймать» освобождение переменной в деструкторе класса:
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()
а затем выбрать один элемент, но только нужные вам данные.