Что лучше при освобождении памяти с помощью PHP: unset () или $ var = null - PullRequest
233 голосов
/ 25 февраля 2009

Я понимаю, что второе исключает накладные расходы при вызове функции ( update , на самом деле является языковой конструкцией), но было бы интересно узнать, лучше ли одно, чем другое. Я использовал unset() для большей части своего кодирования, но недавно я просмотрел несколько респектабельных классов, найденных в сети, которые вместо этого используют $var = null.

Есть ли предпочтительный вариант и в чем причина?

Ответы [ 12 ]

1 голос
/ 29 октября 2015

unset код, если он не освобождает немедленную память, все еще очень полезен и будет хорошей практикой делать это каждый раз, когда мы передаем шаги кода перед выходом из метода. обратите внимание, это не об освобождении немедленной памяти. Непосредственная память предназначена для процессора, а вторичная память - это ОЗУ.

и это также касается предотвращения утечек памяти.

см. Эту ссылку http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2

Я давно использую unset.

Лучше практиковать подобное в коде, чтобы мгновенно сбрасывать все переменные, которые уже использовались в качестве массива.

$data['tesst']='';
$data['test2']='asdadsa';
....
nth.

и just unset($data); для освобождения использования всех переменных.

см. Связанную тему для отмены

Насколько важно сбросить переменные в PHP?

[ошибка]

0 голосов
/ 02 июля 2017

Для записи, исключая время, которое требуется:

<?php
echo "<hr>First:<br>";
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 
echo "<hr>Unset:<br>";
unset($x);
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 
echo "<hr>Null:<br>";
$x=null;
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n";

echo "<hr>function:<br>";
function test() {
    $x = str_repeat('x', 80000);
}
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 

echo "<hr>Reasign:<br>";
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      
echo memory_get_peak_usage() . "<br>\n"; 

Возвращает

First:
438296
438352
Unset:
438296
438352
Null:
438296
438352
function:
438296
438352
Reasign:
438296
520216 <-- double usage.

Вывод, как нулевой, так и неустановленной свободной памяти, как и ожидалось (не только в конце выполнения). Кроме того, переназначение переменной удерживает значение дважды в некоторой точке (520216 против 438352)

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