Насколько важно сбросить переменные в PHP?
Я немного новичок в PHP, и мне интересно:
Насколько важно сбросить переменные в PHP?
Я знаю, что в таких языках, как C, мы освобождаем выделенную память для предотвращения утечек и т. Д. Используя unset для переменных, когда я закончу с ними, это значительно повысит производительность моих приложений?
Кроме того, есть ли где-нибудь эталонный тест, который сравнивает разницу между использованием unset и не использованием unset?
4 ответа
Посмотрите этот пример (и статью, которую я связал ниже вопроса):
$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
звон $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 фактически не освобождает большую часть чего-либо, поэтому его использование, как правило, совершенно бессмысленно, если логический поток вашего кода не требует его несуществования.
Приложения, написанные на таких языках, как C, обычно работают в течение многих часов. Но время выполнения обычного php-приложения составляет всего около 0,05 сек. Таким образом, гораздо менее важно использовать unset.
Это зависит, вы должны убедиться, что вы unset
очень длинные строки (например, содержимое сообщения в блоге, выбранное из БД).
<?php
$post = get_blog_post();
echo $post;
unset($post);
?>