Насколько важно сбросить переменные в PHP? - PullRequest
33 голосов
/ 11 апреля 2010

Я немного новичок в PHP, и мне интересно:

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

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

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

Ответы [ 4 ]

53 голосов
/ 11 апреля 2010

См. этот пример (и статью , на которую я ссылаюсь под вопросом):

$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'-строки $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 байтов исчерпан , то это стоит крошечных усилий.

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

8 голосов
/ 11 апреля 2010

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

3 голосов
/ 11 апреля 2010

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

0 голосов
/ 11 апреля 2010

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

<?php
$post = get_blog_post();
echo $post;
unset($post);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...