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

Я немного новичок в PHP, и мне интересно: насколько важно отключать переменные в PHP? Я знаю на таких языках, как C, мы освобождаем выделенную память для предотвращения утечек и т.д. Используя unset on variables, когда я закончил с ними, это значительно увеличит производительность моих приложений?

Также есть ли где-нибудь ориентир, который сравнивает разницу между использованием unset и не используя unset?

Ответ 1

См. этот примерстатья Я связан ниже вопроса):

$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      // 120172
echo memory_get_peak_usage() . "<br>\n"; // 121248

$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n";      // 120172
echo memory_get_peak_usage() . "<br>\n"; // 201284

Как вы можете видеть, в какой-то момент PHP исчерпал почти вдвое большую память. Это связано с тем, что перед назначением 'x'-string на $x PHP строит новую строку в памяти, сохраняя также предыдущую переменную в памяти. Этого можно было бы предотвратить с помощью unset ting $x.

Другой пример:

for ($i=0; $i<3; $i++) {
    $str = str_repeat("Hello", 10000);
    echo memory_get_peak_usage(), PHP_EOL;
}

Это выведет что-то вроде

375696
425824
425824

На первой итерации $str до назначения остается пустой. На второй итерации $str будет удерживаться сгенерированная строка. Когда str_repeat затем вызывается во второй раз, он не будет немедленно перезаписывать $str, но сначала создайте строку, которая должна быть назначена в памяти. Таким образом, вы получаете $str и значение, которое должно быть назначено. Двойная память. Если вы отмените $str, этого не произойдет:

for($i=0;$i<3;$i++) {
    $str = str_repeat("Hello", 10000);
    echo memory_get_peak_usage(), PHP_EOL;
    unset($str);
}

// outputs something like
375904
376016
376016

Это имеет значение? Ну, связанная статья суммирует его довольно хорошо с

Это не критично, если не считать.

Не мешает отключать ваши переменные, когда они вам больше не нужны. Возможно, вы находитесь на общем хосте и хотите сделать несколько итераций по большим наборам данных. Если отключение не позволит PHP заканчиваться с допустимым размером памяти XXXX байтов, то это стоит крошечного усилия.

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

Ответ 2

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

Ответ 3

Приложения, написанные на таких языках, как C, обычно работают в течение многих часов. Но обычное время выполнения приложения php составляет около 0,05 сек. Поэтому гораздо менее важно использовать unset.

Ответ 4

Это зависит, вы должны убедиться, что вы unset ted очень длинные строки (например, содержимое блога, выбранное из db).

<?php
$post = get_blog_post();
echo $post;
unset($post);
?>