порядок вызова деструкторов

tony2001

TeaM PHPClub
>а в том, что php не освобождает память после вызова деструктора...
подумай головой и представь себе, чтобы было бы, если бы он это делал.

найди себе какую-нибудь другую несуществующую проблему.
 

Andreika

"PHP for nubies" reader
tony2001
а является ли проблемой/багом то, что php по завершению скрипта удаляет объекты (а не переменные, которые на них ссылаются - что было бы логичнее) в порядке их создания [не подсчитывает/хренова подсчитывает ссылки на объекты].
или так было задумано и в этом есть какой-то глубокий смысл?
 
tony2001
Пример того, что память не освобождается вовремя:
Очень-очень большая объектная структура (т.е. объекты много раз создаются / уничтожаются ) с большим количеством данных в самих объектах.
+ большая популярность ресурса, т.е. частое обращение к какому-либо скрипту....

=> при каком-то обращении памяти может не хватить, т.к. она вовремя не освобождается. Да, не спорю, вероятность возникновения такой ситуации стремиться к 0, но все же...
имхо - неправильно... :(


Andreika
Согласен с тобой. Например, если бы в моем примере в деструкторе закрывалось какое-либо соединение, то возникали бы ошибки при дальнейшем использовании объекта. (это к тому, что php неправильно считает кол-во существующих ссылок)
(+ пример автора топика)
 

AnToXa

prodigy-одаренный ребенок
Loshadka
1. память освобождается при завершении исполнения скрипта.
2. в пхп это не деструкторы в нормальном смысле слова, а как finalizers в java скорее.
3. соединения с базами закроются по окончании работы скрипта, все вообще ресурсы буддут освобождены, если только они не persistent.

повторяю, gc не освобождает вас от необходимости следить за ресурсами.
 

tony2001

TeaM PHPClub
Andreika
>а является ли проблемой/багом то, что php по завершению скрипта удаляет объекты
> (а не переменные, которые на них ссылаются - что было бы логичнее) в порядке их
> создания.
нет чёткого порядка, я уже говорил, поэтому вопрос смысла не имеет.

>Пример того, что память не освобождается вовремя:
>Очень-очень большая объектная структура (т.е. объекты много раз создаются /
> уничтожаются ) с большим количеством данных в самих объектах.
>+ большая популярность ресурса, т.е. частое обращение к какому-либо скрипту....

очень-очень большая структура, хорошо.
большая популярность ресурса (непонятно причем, но ладно), очень хорошо.

>=> при каком-то обращении памяти может не хватить, т.к. она вовремя не освобождается.

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

>Да, не спорю, вероятность возникновения такой ситуации стремиться к 0, но все
> же... имхо - неправильно...

вероятность того, что по звершению скрипта вся память освобождается равна 100%.
ты что-то явно перепутал и продолжаешь самому себе морочить голову.
 

Andreika

"PHP for nubies" reader
tony2001
говорил ) да я и сам вижу, что нет четкого ( по крайней мере осмысленного) порядка.
непонятно только - это было так задумано или это так получилось и (лень править OR и так сойдет) ?
а также непонятно почему php зная, что ему еще обрабатывать кучу кода (в деструкторах) так наплевательски относится к своим почетным обязанностям.
"вот до последнего байта скрипта буду работать как надо, а потом в свое удовольствие поосвобождаю ресурсы как бог на душу положит"
 

tony2001

TeaM PHPClub
http://bugs.php.net/bug.php?id=30823
http://news.php.net/php.internals/7530

>а также непонятно почему php зная, что ему еще обрабатывать кучу кода (в
> деструкторах) так наплевательски относится к своим почетным обязанностям.
>"вот до последнего байта скрипта буду работать как надо, а потом в свое
>удовольствие поосвобождаю ресурсы как бог на душу положит"

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

Andreika

"PHP for nubies" reader
tony2001
а "как" от "почему" отличить сможешь? :)

- Objects are destroyed in the order they are created. This is, in my opinion, bad.
-Thank you for taking the time to write to us, but this is not a bug.

пасибо, полегчало.

наиболее подходящий ответ на вопрос почему - п1 второй ссылки
The dependency problems during shutdown which could cause destructors not to be called under certain circumstances - are gone now.

вопрос еще остался, ща объясню
 

tony2001

TeaM PHPClub
>а "как" от "почему" отличить сможешь?
что ты.. это слишком сложно для меня.
 

Andreika

"PHP for nubies" reader
PHP:
class A {

   private $x = null;

   function __construct($x) {
       echo "CONSTRUCTOR A<BR>";
       $this->x = $x;
   }

   function __destruct() {

      echo "DESTRUCTOR A<BR>";
      $this->x = null;
   }

   function C() {

      $this->x->S();
   }

   function F() {
      $this->x = null;
   }

   function K () {

     echo "OK<BR>";
   }
}

class B {

   private $m;

   function __construct() {

      $this->m = mt_rand(100,1000);
      echo "CONSTRUCTOR B - ".$this->m."<BR>";
   }

   function __destruct() {

      echo "DESTRUCTOR B ".$this->m."<BR>";
      $this->m = 0;
   }

   function S () {

      echo "S(".$this->m.")<BR>";
   }
}

 $b = new B();
 $a = new A($b);
 $b = null; // 1
 $a->C();
 $a->F(); // 2
 $a->K(); // 3
// end of script
до строки 1 на B было 2 ссылки - одна в $b другая в $a->x
после строки 1 ссылка осталась одна и до строки 3 вызывается деструктор B - т.е. ссылок на B не осталось и объект удален - все красиво, счетчик ссылок работает.
если закомментировать 1 или 2, то объект доживет до конца скрипта и потом вызовется его деструктор - опять все замечательно, так и должно быть :)

допустим мы закомментили 1 и 2 - на B остаются 2 ссылки
чудеса начинаются после того, как образно говоря php отработал последний байт скрипта - у него отрубается блок подсчета ссылок, он начинает убивать не переменные, а объекты.
по нормальному php должен поступать примерно так :
unset($b); - на B жива одна ссылка - объект жив (а в реале здесь делается delete B)
unset($a); - ссылки на A = 0, вызывается деструктор A -
$this->x = null; -> убивается последняя ссылка на B
если в деструкторе А нет такого, то ссылка удаляется при выходе из деструктора
число ссылок на B = 0 => вызывается деструктор B

так не сделано, а сделано както по другому... почему? производительность упадет? лень делать? ошибка в вышеописанной логике? вопрос "почему" открыт
 
tony2001
> > => при каком-то обращении памяти может не хватить, т.к. она вовремя не освобождается.
> это должно следовать из двух предыдущих утверждений?
> если да, то поясните связь.

Пример. ~ Одновременно запускаются n скриптов. Каждый для своих нужд потребляет в единицу времени 1/n всех ресурсов сервера. Но всего каждый из них для своей работы требует, скажем, 3/n всех ресурсов.

Получаем такую ситуацию. Если после вызова деструктора память будет освобождаться, то ничего страшного не произойдет, т.е. каждым скриптом будет постоянно использоваться не более 1/n всех ресурсов.

А если память не будет освобождаться, то в конце работы каждого скрипта из будет использоваться 3/n всех ресурсов => возрастает вероятность ситуации возникновения тормозов и т.д...

-~{}~ 30.01.06 17:52:

мда... привел пример того, что автоматическая сборка мусора -не всегда хорошо :(

-~{}~ 31.01.06 11:39:

имхо, стоит закрыть этот топик.
 
Сверху