Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нужен ли unset?
 
 автор: Maxam   (14.10.2012 в 02:50)   письмо автору
 
 

Нужен ли unset вообще? В каких ситуациях его применяете вы? Ведь он же удленняет время обработки скрипта, разве нет?

  Ответить  
 
 автор: Aurus   (14.10.2012 в 12:37)   письмо автору
 
   для: Maxam   (14.10.2012 в 02:50)
 

Тоже интересует этот вопрос. Как я понял, unset используется для уничтожения переменных на протяжении сессии. Но я не понимаю где хранятся переменные и что будет с ними если я их не удалю unset'ом. Существует ли понятие утечка памяти как в С++?

  Ответить  
 
 автор: Maxam   (14.10.2012 в 14:47)   письмо автору
 
   для: Aurus   (14.10.2012 в 12:37)
 

То есть, если не удалить переменную использованную, то она может быть прочитана сторонними людьми?

  Ответить  
 
 автор: speedsoft   (14.10.2012 в 14:50)   письмо автору
 
   для: Maxam   (14.10.2012 в 14:47)
 

нет, нет и нет. По большей части unset нужен именно для _SESSION. т.к. они работают между вызовами скрипов. Для обычных переменных не обязательно. Сборщик мусора прекрасно все убъет. Если у Вас огромный скрипт, который выполняется очень долго (минуты, часы) то может и имеет смысл очищать лишнее, чтобы чуть очистить память на время работы. Но в обычных скриптах это не нужно.

  Ответить  
 
 автор: Maxam   (14.10.2012 в 16:34)   письмо автору
 
   для: speedsoft   (14.10.2012 в 14:50)
 

То есть дополнительное unset ускорит всё таки работу скрипта?

  Ответить  
 
 автор: speedsoft   (14.10.2012 в 16:55)   письмо автору
 
   для: Maxam   (14.10.2012 в 16:34)
 

тут от объемов зависит. в обычном скрипте (сайте) это будет капля в море (хотя конечно же от объема зависит). а на больших и тяжелых, это может разгрузить память. Представьте (гипотетически) у Вас массив на 100мб. Вы в начале вызвали, поработали с ним, потом другой на 100 вызвали. уже 200мб озу как сдуло. Но ведь если первый больше не нужен, можно его и очистить. Зачем занимать эти 100мб, если они уже не нужны. Но если у Вас переменная в которой хранится 100-200 байт... ну смысл от очистки, если через пару секунд скрипт закончит работу и сборщик сам все уберет.
Но в тоже время, я не думаю что unset хоть как-то значимо удлиняет работу скрипта. Поэтому если удалите вручную не используемую переменную, ничего плохого не будет.

  Ответить  
 
 автор: speedsoft   (14.10.2012 в 17:14)   письмо автору
 
   для: Maxam   (14.10.2012 в 16:34)
 

Вот провел экспериментик

Подопытный код без очистки

for ($x=0; $x<10000; $x++){
    $s='i'.$x;
    $$s = $x;
}

Время = 0.015538


А теперь с очисткой

for ($x=0; $x<10000; $x++){
    $s='i'.$x;
    $$s = $x;
    unset($$s);
}

Время = 0.015574

на 10000 ансетах, разница в десятитысячных долях секунды.

Другое дело память. Если объемы большие в переменных (как писал выше), то можно очистить. В любом случае из тестов видно, что если поставите очистку - "тормоза" будут стремиться к 0

  Ответить  
 
 автор: Maxam   (14.10.2012 в 22:10)   письмо автору
 
   для: speedsoft   (14.10.2012 в 17:14)
 

А как вы время подсчитали? В скрипте почему-то не написали. Ведь раз, два, три запустить — может даже измениться число в другую сторону.

  Ответить  
 
 автор: speedsoft   (14.10.2012 в 23:01)   письмо автору
 
   для: Maxam   (14.10.2012 в 22:10)
 


<?php
function get_formatted_microtime() {
   list(
$usec$sec) = explode(' 'microtime());
   return 
$usec $sec;
};
$time_start=get_formatted_microtime();

for (
$x=0$x<10000$x++){
    
$s='i'.$x;
    $
$s $x;
    unset($
$s);
}

$time_end=get_formatted_microtime();
$time=round($time_end-$time_start6);
 echo 
"TOTAL:".$time;


насчет туда-сюда, это и говорит о том, что unset не тормозит скрипт. Но и его отсутствие не ускоряет работу. Поэтому можно опустить если данных не много в переменной.

  Ответить  
 
 автор: Гость   (15.10.2012 в 09:24)   письмо автору
 
   для: speedsoft   (14.10.2012 в 17:14)
 

Не совсем то измеряете. Тут скорее надо измерять не время выполнение, а объем занимаемой памяти. Простым добавлением unset-а в биллинге я уменьшил занимаемую им память с 150-ти мегабайт до 30-ти, что довольно существенно.

  Ответить  
 
 автор: speedsoft   (15.10.2012 в 09:54)   письмо автору
 
   для: Гость   (15.10.2012 в 09:24)
 

Вопрос топика был в "замедлении" скрипта. Я привел тест, где видно что это капля в море. А про память я написал.

  Ответить  
 
 автор: psychomc   (21.12.2012 в 18:44)   письмо автору
 
   для: speedsoft   (14.10.2012 в 17:14)
 

а почему это Вы время считали? тут память надо считать

  Ответить  
 
 автор: Владимир55   (15.10.2012 в 13:17)   письмо автору
 
   для: Maxam   (14.10.2012 в 02:50)
 

Нужен ли unset вообще? В каких ситуациях его применяете вы?

Лично я применение этого оператора сделал нормой и, как правило, начинаю скрипт с удаления всех переменных и, в особенности, массивов.

Но отнюдь не в целях экономии памяти!

А для того, чтобы при повторном использовании этой переменной или массива, в них не попали ранее заданные значения. Ибо потом отыскивать проблему гораздо сложнее, чем сразу от нее защититься.

В особенности это важно в случаях, когда используются переменные с традиционными именами, например при работе с базами в выражениях типа

<?php
$res 
mysql_query($query);
while(
$row mysql_fetch_assoc($res))


Ну и, конечно же, в случае использования условия, основанного на существовании переменной, вроде

<?php
If ($x) echo “YES”;

  Ответить  
 
 автор: Sfinks   (15.10.2012 в 13:44)   письмо автору
 
   для: Владимир55   (15.10.2012 в 13:17)
 

> начинаю скрипт с удаления всех переменных и, в особенности, массивов.
Не очень понял, как это?
Когда скрипт начинает работать, никаких переменных не объявлено, кроме суперглобальных $_POST, $_GET, $_COOKIE, $_REQUEST, $_SESSION, $GLOBALS и т.п.
Тогда что Вы Unset'аете?

  Ответить  
 
 автор: Владимир55   (15.10.2012 в 13:52)   письмо автору
 
   для: Sfinks   (15.10.2012 в 13:44)
 

Когда скрипт начинает работать, никаких переменных не объявлено

Это конечно. И ничего удалять в первых строках нет необходимости.

Но иногда в процессе создания или отладки первые строки становятся уже не первыми, ибо перед ними пявляются новые коды, или заносятся в цикл, или этот фрагмент перекочевывает в другой часть скрита, или еще что-то в этом роде. А потому при создании можно что-то недоглядеть, и обнаружится это нескоро, если скрипт сложный.

Поэтому я взял себе за правило делать фрагменты, защищенные от этих проблем.

Конечно же, это не правило. Это манера, и не более того.

  Ответить  
 
 автор: confirm   (15.10.2012 в 14:00)   письмо автору
 
   для: Владимир55   (15.10.2012 в 13:52)
 

>для того, чтобы при повторном использовании этой переменной или массива, в них не попали ранее заданные значения.

Каким образом оно может попасть, если вы эту переменную фактически заново инициализируете?

unset как раз для случаев экономии памяти, и сброса параметра, который оперирует в условиях.

  Ответить  
 
 автор: psychomc   (15.10.2012 в 18:47)   письмо автору
 
   для: Maxam   (14.10.2012 в 02:50)
 

а чем еще удалить элемент массива?

  Ответить  
 
 автор: Valick   (15.10.2012 в 21:06)   письмо автору
 
   для: Maxam   (14.10.2012 в 02:50)
 

иногда unset() это неотъемлемая часть логики скрипта

 <?php
function badship($kor,$point,$x,$y){
if(empty(
$kor)) {echo "отсутствует массив ячеек игрового поля"; return false;}
if(empty(
$point)) {echo "отсутствует координата выстрела"; return false;}
if(empty(
$x)||empty($y)) {echo "отсутствует размерность игрового поля"; return false;}
$r[$point]=4;
$a=1;
    if(isset(
$kor[$point-$a])){
        if(
$kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
        if(
$kor[$point-$a]==3){
            while(isset(
$kor[$point-$a])){
                if(
$kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
                
$r[$point-$a]=4$a++;}
        }
    }
$a=1;
    if(isset(
$kor[$point+$a])){
        if(
$kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
        if(
$kor[$point+$a]==3){
            while(isset(
$kor[$point+$a])){
                if(
$kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
                
$r[$point+$a]=4$a++;}
        }
    }
$a=$y;
    if(isset(
$kor[$point-$a])){
        if(
$kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
        if(
$kor[$point-$a]==3){
            while(isset(
$kor[$point-$a])){
                if(
$kor[$point-$a]==1){unset($r); $r[$point]=3; return $r;}
                
$r[$point-$a]=4$a=$a+$y;}
        }
    }
$a=$y;
    if(isset(
$kor[$point+$a])){
        if(
$kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
        if(
$kor[$point+$a]==3){
            while(isset(
$kor[$point+$a])){
                if(
$kor[$point+$a]==1){unset($r); $r[$point]=3; return $r;}
                
$r[$point+$a]=4$a=$a+$y;}
        }
    }
return 
$r;
}
?> 

  Ответить  
 
 автор: AndDriga   (20.10.2012 в 21:49)   письмо автору
 
   для: Valick   (15.10.2012 в 21:06)
 

Он нужен в специфических случаях, когда вам точно нужно удалить переменную. Допустим, у вас очень большой массив, его можно удалить сразу же чтобы высвободить занятую память. Или вы хотите удалить элемент массива, к которому не хочется идти через итератор; к которому неприменим array_pop / array_shift.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования