Ответ 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 может сэкономить вам деньги на большее количество ОЗУ или дополнительного сервера.