unset
unset () уничтожает указанные переменные.
Поведение unset () внутри функции может варьироваться в зависимости от типа переменной, которую вы пытаетесь уничтожить.
Если внутри функции глобализированная переменная unset (), уничтожается только локальная переменная. Переменная в вызывающей среде сохранит то же значение, что и до вызова unset () .
function destroy_foo( ) < global $foo; unset($foo); > $foo = 'bar'; destroy_foo(); echo $foo; ?>
Выводится приведенный выше пример:
Чтобы отключить () глобальную переменную внутри функции, используйте для этого массив $GLOBALS :
function foo( ) < unset($GLOBALS['bar']); > $bar = "something"; foo(); ?>
Если переменная, которая ПРОХОДИТ ПО ССЫЛКЕ, находится внутри функции unset (), уничтожается только локальная переменная. Переменная в вызывающей среде сохранит то же значение, что и до вызова unset () .
function foo(&$bar) < unset($bar); $bar = "blah"; > $bar = 'something'; echo "$bar\n"; foo($bar); echo "$bar\n"; ?>
Выводится приведенный выше пример:
Если статическая переменная unset () внутри функции, unset () уничтожает переменную только в контексте остальной части функции. Следующие вызовы восстановят предыдущее значение переменной.
function foo( ) < static $bar; $bar++; echo "Before unset: $bar, "; unset($bar); $bar = 23; echo "after unset: $bar\n"; > foo(); foo(); foo(); ?>
Выводится приведенный выше пример:
Before unset: 1, after unset: 23 Before unset: 2, after unset: 23 Before unset: 3, after unset: 23
Parameters
Переменная,которая должна быть отменена.
Как очистить значения всех переменных?
Подскажи, пожалуйста, нужно ли всегда чистить переменные в конце своего кода или php сам очистит себя от мусора после выполнения всего кода?
Просто был у меня однажды случай, когда сервак у меня тупо завис из-за переполнения памяти, я слишком часто обращался к своему php скрипту пока он вдруг не лег, а ведь этого по идее не должно было быть.
Надим Закиров, когда скрипт завершает работу память освобождается автоматически.
Посмотрите профайлером в какой момент у вас максимальное потребление памяти, оптимизируйте самые нагруженные участки.
Также можете прямо во время работы скрипта проверять memory_get_usage и memory_get_peak_usage
И можете узнавать сколько памяти доступно в системе https://stackoverflow.com/questions/1455379/get-se.
Stalker_RED, хммм. а может такое быть, что я прервал запрос в браузере по таймауту в 5 сек, но скрипт на сервере продолжил выполнятся и через 10 и через 15 секунд?
Надим Закиров, есть параметр ignore_user_abort, при котором выполнение на сервере будет продолжаться,
Кроме того, если сигнал со стороны браузера не пришел (обрыв связи, например), или даже не был отправлен (браузер завис, вкладка крешнуласть) то выполнение продолжится, пока не завершится по таймауту.
Stalker_RED, случаем не знаете, может есть способы ограничить время выполнения кода? Например, в одном из GET-параметров я мог бы передавать желаемый таймаут, только как бы заставить PHP скрипт работать не дольше, чем указанный мной таймаут?
Удалить все переменные в php
Можно ли очистить все переменные на текущей странице или я могу получить список всех переменных, в которых уже хранятся некоторые данные?
Если вам нужно спросить, ваша архитектура, вероятно, нуждается в доработке. Если вы ограничиваете область видимости переменных, то отслеживать особо нечего, и каждая область должна быть настолько минимальной, чтобы переменные постоянно сбрасывались просто за счет изменения области. — deceze
Я использую так много переменных на странице, могу ли я получить все имена переменных, которые я назначил на этой странице? — Subhojit Mukherjee
Что сказал обман; если вам нужно использовать get_defined_vars() чтобы отслеживать ваши переменные в области видимости, у вас слишком много переменных в этой области. — cmbuckley
Хороший. Спасибо за информацию, эта информация мне очень поможет. Пожалуйста, опубликуйте еще несколько предложений — Subhojit Mukherjee
2 ответы
Если вы хотите распечатать полный список переменных (включая суперглобальные), просто:
print_r(array_keys(get_defined_vars()));
Кроме того, как некоторые другие упоминали в комментариях, если вам это нужно, вы можете подумать об уменьшении количества переменных, которые вы используете. Три самых простых способа сделать это (по моему опыту) — это перезаписать переменные, когда это необходимо, например (глупый пример):
$subtotal = 0; for($i=0;$i <10;$i++)< $subtotal = $subtotal + $i; >$total = $subtotal;
что позволяет вам иметь одну-единственную переменную, а не три (это также уменьшит выделение памяти). Другой полезный прием — хранить связанные переменные в массиве или объектах. Например, вместо:
$number_of_widgets = 10; $size_of_widgets = '120cm'; $cost_of_widgets = '$10.00'; $number_of_cogs = 13; $size_of_cogs = '40cm'; $cost_of_cogs = '$3.00';
их намного легче отслеживать (и предотвращать случайную перезапись переменных), если вы добавляете их в ассоциативные массивы:
$widgets = array('quantity'=>10,'size'=>'120cm','cost'=>'$10.00'); $cogs = array('quantity'=>13,'size'=>'400cm','cost'=>'$3.00');
И, наконец, если ваша переменная не будет изменяться (и не является массивом), просто используйте определенную константу:
define('MAX_WIDGET_QUANTITY',300);
Это имеет то преимущество, что (а) им действительно легко управлять в будущем, если вы когда-либо захотите изменить эти ограничения, (б) он автоматически доступен в глобальной области видимости и (в) упрощает чтение кода, поскольку он есть очевидно, что это должно быть фиксированное значение и не должно изменяться.
Есть и другие уловки, но они, как правило, далеко продвигают вас к управляемости переменных.
Удаление всех переменных не завершая самого скрипта!
Как можно в ходе выполнения скрипта удалить все переменные, которые были ранее объявлены?
Просто мне нужно пустить скрипт по кругу, обычным циклом, а множество переменных могут иметь остатки данных после предыдущего шага цикла.
PS: За ‘script.php’ скрывается множество других скриптов, которые вызывают друг-друга, он просто главный, скажем так, не считая ‘index.php’, в котором этот цикл собственно и запускается
tostrss
Мой дом здесь!
В пхп нельзя просто взять массово убить все переменные кроме каких-то. Ведь тогда могу убится нужные, поэтому надо убивать точечно через unset();
_AlexSK_
Постоялец
bugargen
Местный житель
В пхп нельзя просто взять массово убить все переменные кроме каких-то. Ведь тогда могу убится нужные, поэтому надо убивать точечно через unset();
Жаль, очень жаль
Хотя, по идеи, могли бы придумать такую ф-цию. Ведь это очевидно — есть переменные, которые PHP создаёт-мусолит, а есть, которые явно прописаны в скрипте — вот их и нужно удалять. В общем — х.з.
Я ещё когда начинал писать этот скрипт — думал, что может лучше подчищать за собой переменные, но смысла в этом небыло никакого, только с точки зрения грамотности кода. А теперь — понадобилось, но все их перебирать сложно. О причине такой необходимости ниже.
Можно и Крон заюзать. Но это всё мне не подходит совершенно!
Мне нужен не просто запуск скрипта несколько раз, а запуск скрипта столько раз, сколько встретится каталогов в указанной директории + к этому наименования этих каталогов идут в качестве передаваемого значения + счётчик.
В общем, придётся идти длинным путём.
tostrss
Мой дом здесь!
В чем проблема вручную удалять крупные переменные? В конце концов, можете сами написать свой сборщик мусора, в чем проблема то?
_AlexSK_
Постоялец
Да, в таком случае, лучше пройтись по файлам-скриптам и подчистить за собой переменные. По-идее, это не займет много времени.
potuga
Гуру форума
А лучше всего взять за правило перед использованием той переменной, где потенциально могут содержаться ненужные данные, всегда юзать unset() и проблем потом не будет
ZCFD
Мой дом здесь!
1)require_once ? так он пордключится всего один раз. По определению
так что там должно быть require. ну или я не понял идею и прошу мне объяснить. Т.к. интересно )))
2) я хз конечно. просто пердположение — вынеси require(‘script.php’); в отдельную функцию и в цикле вызывай уже эту функцию. Т.е. итерация заканчивается после выполнения scripts.php. При вызове функции все созданные в ней переменные являются локальными по умочанию. И при выходе из функции должны удаляться. — В теории.
RolCom
Постоялец
Хотя, по идеи, могли бы придумать такую ф-цию. Ведь это очевидно — есть переменные, которые PHP создаёт-мусолит, а есть, которые явно прописаны в скрипте — вот их и нужно удалять. В общем — х.з.
В других языках для этого есть переменные с лексической областью видимости, т.е. видимые до конца текущего блока. PHP может быть когда-нибудь поправят, но точно не раньше 6-ой версии.
Вызывай файл внутри функции.
bugargen
Местный житель
я хз конечно. просто пердположение — вынеси require(‘script.php’); в отдельную функцию и в цикле вызывай уже эту функцию. Т.е. итерация заканчивается после выполнения scripts.php. При вызове функции все созданные в ней переменные являются локальными по умочанию. И при выходе из функции должны удаляться. — В теории.
Похоже, это действительно работает ТОЛЬКО в теории
После использования этого метода — сразу полезла куча варнингов с указанием на то, что очередной параметр в очередную функцию не передался (этих ф-ций у меня множество, как и модулей, в которых они содержатся). х.з. почему так, не смог разобраться. Видимо, переменные перестали быть глобальными (где они объявляны таковыми), или ещё что-то.
Короче я решил пройтись по всем модулям и в конце каждого прописать уничтожение всех использованных в нём переменных. На будущее — возьму это за правило: в конце кода каждого модуля — отдельный блок, посвящённый обнулению/удалению переменных.