![]() |
![]() ![]() |
![]() |
![]()
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 ![]() session.class.php db.class.php classloader.class.php |
|
|
![]()
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.
-------------------- |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 30.05.2007 Skąd: Wędzina Ostrzeżenie: (0%) ![]() ![]() |
Też racja.
Ale nawet nie o to mi chodziło. Chciałbym uzyskać odpowiedź na temat tego destruktora, dlaczego to nie działa. W sumie jakoś pracy szczególnie nie utrudnia, ale bywa w małym stopniu irytujące, gdyż (moim zdaniem) powinno wszystko działać. |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Przez lata programiści nauczyli się nie ufać destruktorom w PHP. Sprawiały mnóstwo problemów (wystarczy poczytać komentarze w odpowiednim rozdziale manuala). Istnieje obejście tego problemu, dosyć szeroko stosowane w wielu frameworkach - swój własny wirtualny system zarządzania obiektami.
A wykorzystujesz to mniej więcej tak.
Wszystko pisane z palca, więc jakby co poprawiać lub pytać ![]() Pozdrawiam Też racja. Ale nawet nie o to mi chodziło. Chciałbym uzyskać odpowiedź na temat tego destruktora, dlaczego to nie działa. W sumie jakoś pracy szczególnie nie utrudnia, ale bywa w małym stopniu irytujące, gdyż (moim zdaniem) powinno wszystko działać. O ile sam nie usuwasz obiektów robi to samo PHP przy zakończeniu skryptu - a wtedy nie możesz być 100%-owo pewny kolejności. Rozwiązanie powyżej. Ten post edytował LBO 16.08.2009, 18:44:58 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa 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. 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. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 13 Pomógł: 0 Dołączył: 30.05.2007 Skąd: Wędzina Ostrzeżenie: (0%) ![]() ![]() |
Cytat O ile sam nie usuwasz obiektów robi to samo PHP przy zakończeniu skryptu - a wtedy nie możesz być 100%-owo pewny kolejności. Rozwiązanie powyżej. Więc chyba przebuduję swoją aplikacyjkę, wywalę destruktory i zastąpię to tym (nieco zmienionym - mam chyba pomysł) rozwiązaniem. Czytałem sporo o tych destruktorach i faktycznie pojawiło się trochę informacji o "wałkach" jakie robią. Myślałem, że dotyczyły one wersji PHP <=5.1, a tu proszę. Dziękuję za rzeczowe uwagi. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 415 Pomógł: 117 Dołączył: 7.09.2005 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
dodałem kilk małych zmian w kodzie.
Więc chyba przebuduję swoją aplikacyjkę, wywalę destruktory i zastąpię to tym (nieco zmienionym - mam chyba pomysł) rozwiązaniem. Czytałem sporo o tych destruktorach i faktycznie pojawiło się trochę informacji o "wałkach" jakie robią. Myślałem, że dotyczyły one wersji PHP <=5.1, a tu proszę. Dziękuję za rzeczowe uwagi. Oczywiście, musisz to zmienić, żeby było używalne. To co przedstawiłem to jedynie zalążek ![]() |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- |
|
|
![]()
Post
#9
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat 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. Wygaśnięcia, to znaczy? Bo pierwsze słyszę o wygasaniu połączeń... Cytat 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. W sterownikach stricte obiektowych jest to realizowane właśnie w destruktorach. -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 890 Pomógł: 339 Dołączył: 14.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
@-=Peter=-, @erix,
oczywiście macie rację. Strasznie nabredziłem. Cytat Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution. Jednak dalej jestem przekonany do zamykania połączenia w destruktorze. @erix, usuń proszę mojego poprzedniego posta, albo przekreśl jego treść - niech nie miesza ludziom w głowie. Ja już nie mogę edytować. |
|
|
![]()
Post
#11
|
|
![]() Grupa: Moderatorzy Postów: 15 467 Pomógł: 1451 Dołączył: 25.04.2005 Skąd: Szczebrzeszyn/Rzeszów ![]() |
Cytat usuń proszę mojego poprzedniego posta, albo przekreśl jego treść - niech nie miesza ludziom w głowie. Zrobione. Na przyszłość raportuj. Cytat Jednak dalej jestem przekonany do zamykania połączenia w destruktorze. Wiesz, kiedyś działy mi się dziwne rzeczy, jeśli używałem mysql_free_result w destruktorze. ![]() -------------------- ![]() ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW! |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 15.08.2025 - 03:33 |