Это было упомянуто на нерабочей странице руководства в 2009 году :
unset()
делает только то, что говорит его имя - сбросить переменную. Это не вызывает немедленного освобождения памяти. Сборщик мусора в PHP сделает это, когда посчитает нужным - преднамеренно, так как эти циклы ЦП в любом случае не нужны, или так поздно, как сценарию не хватило бы памяти, что бы ни произошло первым.
Если вы делаете, $whatever = null;
то вы переписываете данные переменной. Вы можете освободить / сжать память быстрее, но это может украсть циклы процессора из кода, который действительно в них нуждается, быстрее, что приведет к увеличению общего времени выполнения.
(С 2013 года эта unset
страница руководства больше не включает этот раздел)
Обратите внимание, что до php5.3, если у вас есть два объекта в циклической ссылке , например, в родительско-дочерних отношениях, вызов unset () для родительского объекта не освободит память, используемую для родительской ссылки в дочернем объекте. (Также память не будет освобождена, когда родительский объект будет собран мусором.) ( Ошибка 33595 )
Вопрос « разница между unset и = null » детализирует некоторые различия:
unset($a)
также удаляет $a
из таблицы символов; например:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Выходы:
Notice: Undefined variable: a in xxx
NULL
Но когда $a = null
используется:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Кажется, $a = null
это немного быстрее, чем его unset()
аналог: обновление записи в таблице символов происходит быстрее, чем ее удаление.
- когда вы пытаетесь использовать
unset
переменную non-existing ( ), возникает ошибка, и значение для выражения переменной будет нулевым. (Потому что, что еще должен делать PHP? Каждое выражение должно приводить к некоторому значению.)
- Переменная с присвоенным ей нулем все еще остается совершенно нормальной переменной.
$whatever
указывает на объект,$whatever = null
перезаписывает указатель, а не сам объект, поэтому он действует в основном так же, какunset()
.unset
на самом деле это не функция, а языковая конструкция . Это не более вызов функции, чем areturn
или aninclude
.Помимо проблем с производительностью, используя
unset
делает ваш код намерения гораздо понятнее.источник
unset
какUnSeT
, например. Сообщество остановилось на строчных буквах как вопрос стиля, но другие оболочки все еще работают.Выполнив unset () для переменной, вы, по сути, пометили переменную как «сборщик мусора» (в действительности у PHP такой нет, но, например, ради), поэтому память не сразу доступна. Переменная больше не хранит данные, но стек остается большего размера. Выполнение нулевого метода удаляет данные и практически сразу сокращает объем стека.
Это было из личного опыта и других. Смотрите комментарии функции unset () здесь .
Лично я использую unset () между итерациями в цикле, так что мне не нужно, чтобы задержка стека была равна йо-йо. Данные ушли, но след остается. На следующей итерации php уже забирает память и, следовательно, быстрее инициализирует следующую переменную.
источник
Похоже, что "= ноль" быстрее.
Результаты PHP 5.4:
Результаты PHP 5.3:
Результаты PHP 5.2:
Результаты PHP 5.1:
Вещи начинают выглядеть по-другому с PHP 5.0 и 4.4.
5,0:
4,4:
Имейте в виду, что microtime (true) не работает в PHP 4.4, поэтому мне пришлось использовать пример microtime_float, приведенный в php.net/microtime / Example # 1.
источник
unset
быстрее. У меня есть тест, который позже проверяет наличие вunset
деле. В этом тесте онnull
немного быстрее. Тест: pastebin.com/fUe57C51gc_collect_cycles
перед запуском таймера, чтобы получить более точные результаты.Это имеет значение с элементами массива.
Рассмотрим этот пример
Здесь ключ «тест» все еще существует. Однако в этом примере
ключ больше не существует
источник
Это работает по-другому для переменных, скопированных по ссылке:
источник
Что касается объектов, особенно в сценарии с отложенной загрузкой, следует учитывать, что сборщик мусора работает в незанятых циклах ЦП, поэтому предположим, что вы столкнетесь с проблемами при загрузке большого количества объектов с небольшим временным штрафом, что приведет к освобождению памяти.
Используйте time_nanosleep, чтобы позволить GC собирать память. Установка переменной в null желательна.
Протестировано на рабочем сервере, первоначально работа занимала 50 МБ, а затем была остановлена. После того, как был использован nanosleep, 14 МБ было постоянным потреблением памяти.
Следует сказать, что это зависит от поведения GC, которое может меняться от версии PHP к версии. Но это работает на PHP 5.3 нормально.
например. этот пример (код взят из VirtueMart2 в фиде Google)
источник
Я все еще сомневаюсь в этом, но я попробовал это в своем сценарии, и я использую xdebug, чтобы знать, как это повлияет на использование памяти моего приложения. Скрипт установлен на моей функции следующим образом:
И я добавляю unset непосредственно перед
return
кодом, и он дает мне: 160200, затем я пытаюсь изменить его с$sql = NULL
и он дает мне: 160224 :)Но есть что-то уникальное в этом сравнительном, когда я не использую unset () или NULL, xdebug дает мне 160144 в качестве использования памяти
Итак, я думаю, что указание строки для использования unset () или NULL добавит процесс к вашему приложению, и будет лучше оставаться исходным с вашим кодом и уменьшать используемую вами переменную настолько эффективно, насколько это возможно.
Поправьте меня если я не прав, спасибо
источник
Я создал новый тест производительности для
unset
и=null
, потому что, как упоминалось в комментариях, здесь написано ошибка (воссоздание элементов). Я использовал массивы, как вы видите, теперь это не имело значения.Но я могу только проверить это на сервере PHP 5.5.9, вот результаты: - заняло 4.4571571350098 секунд - заняло 4.4425978660583 секунд
Я предпочитаю
unset
для удобства чтения.источник
PHP 7 уже работал над такими проблемами управления памятью и его сокращение до минимального использования.
PHP 7.1 Outpu:
заняло 0.16778993606567 секунд заняло 0.16630101203918 секунд
источник
unset
код, если не освобождает немедленную память, все еще очень полезен и будет хорошей практикой делать это каждый раз, когда мы передаем шаги кода перед выходом из метода. обратите внимание, это не об освобождении немедленной памяти. Непосредственная память для процессора, а как насчет вторичной памяти, которая является оперативной памятью.и это также решает проблему предотвращения утечек памяти.
пожалуйста, смотрите эту ссылку http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2
Я давно использую unset.
лучше использовать этот метод в коде для мгновенного сброса всех переменных, которые уже использовались в качестве массива.
и
just unset($data);
освободить все переменные использования.пожалуйста, смотрите связанную тему, чтобы сбросить
Насколько важно сбросить переменные в PHP?
[Ошибка]
источник
Для записи, и исключая время, которое требуется:
Возвращается
Вывод, как нулевой, так и сброшенный объем свободной памяти, как и ожидалось (не только в конце выполнения). Кроме того, переназначение переменной удерживает значение дважды в некоторой точке (520216 против 438352)
источник