![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
Witam, chciałem zapytać czy jest jakieś polecenie/wywołanie do zamknięcia połączenia przy PDO i mysql ?
Znalazłem takie coś w skryptach/książkach, i bardzo ciekawie się to sprawdza tylko że niestety niewiem czemu generuje to 25tyś połączeń przy 20użytkownikach.. Czy ktoś jest mi wstanie pomóc/ przerobić to tak żeby nie było połączenia/inicjacji bazy przy każdym dbQuery() ? Ew czy to można jakoś zamknąć ? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
tzn mam dołożyć $dbs->closeCursor(); ?
|
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 46 Pomógł: 10 Dołączył: 30.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Radzę w ogóle zmienić podejście i ten antypattern zamienic na coś rozsądniejszego np:
Obiekt klasy PDO pobierasz przez PdoFactory::get('nazwaPolaczenia'); Jeśli korzystasz tylko z jednej bazy danych możesz zmodyfikować skrypt tak żeby nie trzeba było podawać w ogóle parametru do metody PdoFactory::get() Przed zakończeniem skryptu lub w momencie kiedy jesteś pewien że nie będziesz już potrzebował komunikacji z bazą danych pamiętaj o wywołaniu PdoFactory::closeAll() |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
A mogłbyś jeszcze powiedzieć jak teraz przez to pobrać dane ?
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
Zamiast tworzyć jakieś bzdurne klasy korzystaj z PDO takim jakie jest. http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
-------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 46 Pomógł: 10 Dołączył: 30.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Trzymając się kodu z pierwszego posta i wykorztując klasę PdoFactory którą Ci podałem mogłoby wyglądać to np tak:
Funkcja dbInit() nie jest Ci już potrzebna. Obiekty klasy PDO pobierasz teraz używając klasy PdoFactory. Zaletą tego jest to że PdoFactory::get() nie będzie łączyć się za każdym razem z bazą danych. Zrobi to raz a potem będzie już zwracane wcześniej utworzony obiekt klasy PDO. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
Zamiast tworzyć jakieś bzdurne klasy korzystaj z PDO takim jakie jest. http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO Widziałem tą strone, tylko że $stmt -> closeCursor(); które tutaj jest podane powoduje u mnie błąd Call to undefined method PDO::closeCursor() ' @Methestel To zwykłe pdo nie potrafi zrobić jednego połączenia ? Znalazłem coś takiego: $dbs->db = null; Czy jak wstawie takie coś do dbquery i dbrows na koniec to połączenie zostanie zamknięte po każdym wczytaniu/zmianie ? Ten post edytował Mayka 10.12.2013, 19:32:03 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 2 355 Pomógł: 533 Dołączył: 15.01.2010 Skąd: Bydgoszcz Ostrzeżenie: (0%) ![]() ![]() |
Po co Ci to manualne zamykanie połączenia?
Jak już to $dbs = null; Ten post edytował Damonsson 10.12.2013, 20:10:15 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 46 Pomógł: 10 Dołączył: 30.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Zwykłe PDO jak najbardziej potrafi zrobić jedno połączenie. Tylko chodzi o to żeby nie robił tych połączeń przy każdym zapytaniu tylko maksymalnie raz podczas jednego requesta. Nie wiem jak to prościej wyjaśnić ... może wyobraź sobie że masz do wykonania 100 zapytań do bazy danych.
Masz do wyboru: - przed każdym zapytaniem tworzysz nowe połączenie z bazą danych i wykonujesz zapytanie (łącznie wykonujesz 100 połączeń z bazą danych i 100 zapytań) - tworzysz jedno połączenie z bazą danych i używając tylko tego jednego połączenia wykonujesz kolejno 100 zapytań (łącznie 1 połączenie z bazą danych i 100 zapytań) Efekt końcowy będzie taki sam. Jak myślisz, które rozwiązanie jest lepsze? Tak, jak wstawisz $dbs = null na koniec dbquery to połączenia będą zamykane - zresztą masz to jak wół napisane w dokumentacji http://www.php.net/manual/en/pdo.connections.php Jeśli nie przeszkadza Ci że przy każdym zapytaniu będziesz od nowa łączył się z bazą danych to nie ma problemu. Ten post edytował Methestel 10.12.2013, 20:26:32 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 321 Pomógł: 55 Dołączył: 19.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
tak jak napisał @Methestel problemem w Twoim skrypcie nie jest zamykanie połączeń ale ich nadmierne "otwieranie" - a podejrzewam, że Twoim jest to
-------------------- Polecam MyDevil hosting idealny dla deweloperów
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
Jeśli przy każdym zapytaniu nawiązujesz połączenie z bazą przez dbInit() to jest bezsensu. Jak piszesz w OOP to w konstruktorze nawiązujesz połączenie z bazą i później tylko się odwołujesz przez np. $this->db, albo tworzysz instancję new PDO i działasz na tym w całym dokumencie.
|
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
Jeśli przy każdym zapytaniu nawiązujesz połączenie z bazą przez dbInit() to jest bezsensu. Jak piszesz w OOP to w konstruktorze nawiązujesz połączenie z bazą i później tylko się odwołujesz przez np. $this->db, albo tworzysz instancję new PDO i działasz na tym w całym dokumencie. A jak nie pisze w oop ? To jak to zrobić żeby połączenie było raz wykonywane a nie przy każdym requescie ? Tak, jak wstawisz $dbs = null na koniec dbquery to połączenia będą zamykane - zresztą masz to jak wół napisane w dokumentacji http://www.php.net/manual/en/pdo.connections.php Jeśli nie przeszkadza Ci że przy każdym zapytaniu będziesz od nowa łączył się z bazą danych to nie ma problemu. A czemu ma mi to przeszkadzać bo nie rozumiem ? |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 321 Pomógł: 55 Dołączył: 19.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
To jak to zrobić żeby połączenie było raz wykonywane a nie przy każdym requescie ? przecież @Methestel Ci napisał jak tu Cytat(Mayka) Jeśli nie przeszkadza Ci że przy każdym zapytaniu będziesz od nowa łączył się z bazą danych to nie ma problemu. A czemu ma mi to przeszkadzać bo nie rozumiem ? może twój serwer będzie miał coś przeciwko ;-) ? pewnie masz apache , to zrób sobie test wydajności twojego rozwiązania i tego z jednym inicjowanym połączeniem (np. ab -n 1000 -c 10 ) -------------------- Polecam MyDevil hosting idealny dla deweloperów
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 46 Pomógł: 10 Dołączył: 30.06.2008 Ostrzeżenie: (0%) ![]() ![]() |
Sama się pytasz w pierwszym poście jak zrobić "żeby nie było połączenia/inicjacji bazy przy każdym dbQuery()" a teraz pytasz dlaczego łączenie się z bazą przy każdym zapytaniu ma Ci przeszkadzć :/
Sorry ale ja się poddaje. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
Sam się pytasz w pierwszym poście jak zrobić "żeby nie było połączenia/inicjacji bazy przy każdym dbQuery()" a teraz pytasz dlaczego łączenie się z bazą przy każdym zapytaniu ma Ci przeszkadzć :/ Sorry ale ja się poddaje. Hahaha, chodziło mi bardziej o to, że teraz wiem jak je rozłączyć wiec moge przy każdym pobraniu rozłączyć z bazą i wtedy nie bedzie przekroczenia ilości jednoczesnych połączeń. przecież @Methestel Ci napisał jak tu A czemu ma mi to przeszkadzać bo nie rozumiem ? może twój serwer będzie miał coś przeciwko ;-) ? pewnie masz apache , to zrób sobie test wydajności twojego rozwiązania i tego z jednym inicjowanym połączeniem (np. ab -n 1000 -c 10 ) Nie zrobie bo niemam dostępu do tego serwera -zwykły hosting w nazwie. |
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 304 Pomógł: 1 Dołączył: 12.01.2009 Skąd: Kanapa Ostrzeżenie: (0%) ![]() ![]() |
przecież @Methestel Ci napisał jak tu Czyli dobrze rozumiem że trzeba zrobić to w oop bo inaczej bedzie za każdym dbquery łączył z baza ? Aha i PdoFactory::closeAll() na samym końcu strony tak ? Ten post edytował Mayka 11.12.2013, 18:06:21 |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 4 291 Pomógł: 829 Dołączył: 14.02.2009 Skąd: łódź Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#20
|
|
Grupa: Zarejestrowani Postów: 321 Pomógł: 55 Dołączył: 19.04.2009 Ostrzeżenie: (0%) ![]() ![]() |
powiedz szczerze, nie masz pojęcia co ta klasa PdoFactory robi ?
a z ciekawości po co robisz to Twoje dbquery ![]() -------------------- Polecam MyDevil hosting idealny dla deweloperów
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 4.05.2025 - 08:31 |