Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [5.0.2] Błąd sesji w destructorze
DeyV
post
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




jednak php5 ciągle doskonałe nie jest... Dziś prawie zawału bym dostał przez beznadziejny błąd.
Jeśli moglibyście - sprawdźcie, jak to działa na waszych wersjach php - u mnie w każdym razie na php5.0.2 zarówno na windowsie jak i linuksie pojawił się ten sam błąd.

Natomiast na php 5.1.0 alfa wszystko jest OK.

  1. <?php
  2.  
  3. class test
  4. {
  5.  function __construct()
  6.  {
  7. echo '<br />__construct <br />';  
  8.  var_dump( $_SESSION );
  9.  
  10.  if( empty( $_SESSION['iForConstruct'] ) ) //inicjalizacja
  11.  {  
  12.  $_SESSION['iForConstruct'] = 1;
  13.  $_SESSION['iForDestruct'] = 1;
  14.  }
  15.  $_SESSION['iForConstruct']++;
  16.  }
  17.  
  18.  function __destruct()
  19.  {
  20.  echo '<br />__destruct';  
  21.  $_SESSION['iForDestruct'] ++;
  22.  }
  23. }
  24.  
  25.  
  26. $test = new test();
  27. ?>


Jak łatwo zauważyć - wartość iForDestruct powinna się zwiększać co każde odświerzenie, tak jak to się dzieje w przypadku iForConstruct
Niestety - nic takiego się nie dzieje.




++++++++++++++++++++++++++
Co ciekawe - na bugs.php.net otrzymałem informację, że jest to normalne i oczekiwane zachowanie, ponieważ "The session is ended before destructors are run."

Cikawe, czy to oznacza, że aktualne zachowanie php5.1 zostanie zmodyfikowane, czy też ktoś jednak przekonał się, że jest to jednak niezgodne z oczekiwaniem większości?
Go to the top of the page
+Quote Post
Vengeance
post
Post #2





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

Ostrzeżenie: (0%)
-----


php 5.0.0 i ten sam efekt ;]

jednak jak dam
  1. <?php
  2.  
  3. $test = new test();
  4. unset($test);
  5.  
  6. ?>


to dziala ok czyli wyglada na to ze obiekty sa "kasowane" po "zakończeniu sesji" czy jak to tam nazwać.

Ten post edytował Vengeance 22.10.2004, 21:14:40
Go to the top of the page
+Quote Post
Ozzy
post
Post #3





Grupa: Zarejestrowani
Postów: 204
Pomógł: 0
Dołączył: 26.12.2003
Skąd: Rzeszów

Ostrzeżenie: (0%)
-----


To raczej nie jest błąd. Osobiście nie radzę polegać na __destruct().
Go to the top of the page
+Quote Post
hawk
post
Post #4





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


IMHO to też nie jest błąd. Jeżeli sam nie zniszczysz obiektu, żyje aż do samego końca. Samiutkiego. Nie powinno być tak, że php niszczy wszystkie obiekty, a potem zaczyna robić coś z sesją. A jak do obsługi sesji potrzebne były jakieś obiekty? A jak ktoś ma własny session handler? To co, ma mu się sesja rozwalić bo jego kod już nie istnieje?
Go to the top of the page
+Quote Post
netzah
post
Post #5





Grupa: Zarejestrowani
Postów: 109
Pomógł: 1
Dołączył: 19.03.2004

Ostrzeżenie: (0%)
-----


Czy - mimo, ze tak powinno byc - w php 5.1.0 to sie zmineni??
Go to the top of the page
+Quote Post
DeyV
post
Post #6





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




IMHO powinno być tak, że obiekty z destruktorem napisanym przez użytkownika są niszczone rzed zakończeniem sesji.
Następnie handler sesji uruchamia odpowiednie funkcje (może być to odbiekt sesji, byle nie zawierał metody __destruct() )
A na końcu niszczone pozostałe obiekty.


Nie wiem na pewno, ale wydaje mi się, że jakoś tak działa to w 5.1 (a może inaczej rozwiazali problem session handlera, lub narazie w tym miejscu jest jakiś bug - nie wiem - nie korzystam z własnego)

Ten post edytował DeyV 5.11.2004, 14:21:29
Go to the top of the page
+Quote Post
hawk
post
Post #7





Grupa: Zarejestrowani
Postów: 521
Pomógł: 0
Dołączył: 3.11.2003
Skąd: 3city

Ostrzeżenie: (0%)
-----


To by było straszne. To, czy w danym momencie obiekt jeszcze istnieje, zależy od tego, czy użytkownik napisze sobie (nawet pustą) metodę __destruct?! (IMG:http://forum.php.pl/style_emoticons/default/blink.gif)

A jeżeli ja chcę miec obiekt do obsługi sesji, który ma destruktor? Np. przechowuję sesje w bazie danych i chcę zakończyć połączenie. Cokolwiek. To jest masakrycznie nieintuicyjne. "Jeżeli używasz jakiś klas w obsłudze sesji, to upewnij się, że żadna z nich nie ma metody __destruct. Oraz żadna z ich klas-rodziców. Oraz rodziców rodziców..."

Poza tym, DeyV, w ten sposób kochani developerzy php spowodowaliby jeszcze jedną katastrofę. Wrzucasz jakiś obiekt do sesji. Proste. Koniec skryptu. Teraz php niszczy ten obiekt, a potem - uwaga - serializuje go i zapisuje do pliku (IMG:http://forum.php.pl/style_emoticons/default/blink.gif) . Jeżeli uda im się zserializować obiekt, który właśnie zniszczyli, to chyba dostaną Nobla.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 11:16