Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Destruktor wykonuje się za wcześnie.
kazaa9
post
Post #1





Grupa: Zarejestrowani
Postów: 13
Pomógł: 0
Dołączył: 30.05.2007
Skąd: Wędzina

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


Witam.

Mam dziwny problem z destruktorami i nie za bardzo wiem jak go rozwiązać. Przeglądałem trochę forum i manuala, ale nic w podobnym stylu nie było.

Oto opis mojego problemu: mam prosty systemik, w którym mam m. in. klasy DB (obsługa bazy danych, śle zapytania i przechowuje informacje o ewentualnych błędach) oraz Session (jak sama nazwa mówi - do obsługi sesji).

W klasie Session w destruktorze wywołuję metodę, która kończy mi daną sesję, czyli przy pomocy klasy DB robi UPDATE danych w bazie. Działa, jednak...no właśnie. Gdybym w klasie DB miał destruktor, w którym kończyłbym połączenie z bazą danych, to to zapytanie już wygeneruje błąd, czyli tak jakbym był rozłączony. Dodam jeszcze, że później pobieram sobie pewną metodą informacje o zapytaniach (klasa DB) i brakuje tego ostatniego zapytania kończącego sesję (teraz oczywiście rozważam wersję bez zakończonego połączenia).

Aha, jeszcze dodam (może to mieć jakiś związek - tak przypuszczam), że obiekty pobieram przy pomocy czegoś w stylu rejestru, tzw. ClassLoader'a.
Załączę odnośniki do kodów klas. Na logikę i angielski proszę na razie nie zwracać uwagi - poprawki wprowadzam na bieżąco (IMG:style_emoticons/default/winksmiley.jpg)
session.class.php
db.class.php
classloader.class.php
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
-=Peter=-
post
Post #2





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Jaki jest sens zamykania połączenia z bazą danych w destrukorze klasy Db? Wg mnie nie ma żadnego sensu, bo tak czy siak połączenie z bd jest zamykane na końcu działania aplikacji.
Go to the top of the page
+Quote Post
sowiq
post
Post #3





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

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


Cytat(-=Peter=- @ 16.08.2009, 18:39:47 ) *
Jaki jest sens zamykania połączenia z bazą danych w destrukorze klasy Db? Wg mnie nie ma żadnego sensu, bo tak czy siak połączenie z bd jest zamykane na końcu działania aplikacji.
Mylisz się. Połączenie jest zamykane w chwili jego wygaśnięcia, czyli wcale niekoniecznie po zakończeniu działania aplikacji. Timeout jest ustawiany w opcjach MySQL.

Jeśli odwiedzalność Twojej strony jest na poziomie 1/godzinę, to nie ma to znaczenia. Ale jeśli chcesz stworzyć optymalny skrypt, który wytrzyma obciążenie rzędu kilkuset - kilka tys. odsłon / minutę, to oczekiwanie na wygaśnięcie każdego połączenia nie jest dobrym pomysłem.
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #4





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Cytat(sowiq @ 16.08.2009, 17:35:38 ) *
Mylisz się. Połączenie jest zamykane w chwili jego wygaśnięcia, czyli wcale niekoniecznie po zakończeniu działania aplikacji. Timeout jest ustawiany w opcjach MySQL.

Jeśli odwiedzalność Twojej strony jest na poziomie 1/godzinę, to nie ma to znaczenia. Ale jeśli chcesz stworzyć optymalny skrypt, który wytrzyma obciążenie rzędu kilkuset - kilka tys. odsłon / minutę, to oczekiwanie na wygaśnięcie każdego połączenia nie jest dobrym pomysłem.

Nie wiem czy masz rację, ale moją wiedzę na ten temat zaczerpnąłem z manuala, być może jest tam błąd lub nowsze biblioteki do obsługi baz danych różnią się pod tym względem.

http://pl.php.net/mysql_close
http://pl.php.net/pg_close

Jednak nie znalazłem informacji jak to wygląda np. w mysqli czy PDO, być może jest tak jak mówisz. Oczywiście mówimy tutaj o połączeniach tymczasowych, a nie stałych, które to na pewno nie są zamykane wraz z końcem działania aplikacji.
Go to the top of the page
+Quote Post

Posty w temacie


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: 10.10.2025 - 20:52