См. этот пример (и статью , на которую я ссылаюсь под вопросом):
$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 байтов исчерпан , то это стоит крошечных усилий.
Следует также учитывать, что даже если время жизни запроса составляет всего одну секунду, удвоение использования памяти фактически вдвое уменьшает максимальное количество одновременных запросов, которые могут быть обработаны. Если вы все равно не приблизились к пределу сервера, то кого это волнует, но если это так, то простой сброс может сэкономить вам деньги на дополнительную оперативную память или дополнительный сервер.