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