Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Długi czas łączenia się z bazą
gargamel
post
Post #1





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


Witam,
Na szybko opiszę problem. Po przeniesieniu się na nowy serwer, na którym mamy limit interpretatorów PHP, okazało się że nasza strona pochłania zbyt dużą ich ilość. Wg administratora problem może sprawiać pewien określony plik, który wyjątkowo długo się wykonuje. Po przeanalizowaniu czasu wykonania się poszczególnych partii kodu tego pliku (który swoją drogą jest skrajnie prosty, bo wykonuje tylko jedno proste zapytanie do bazy), okazało że najwięcej czasu zajmuje linijka tworzenia obiektu PDO:
  1. <?php
  2. $dataBaseConnection = new PDO("pgsql:dbname=$db; host=$host", $user, $pass );
  3. ?>

z reguły jest to czas rzędu 0.01s, ale w przypadku uruchomienia tego pliku jednocześnie w kilku zakładkach, czas potrafi się wydłużyć do kilkunastu sekund... Nie wklejam reszty kodu bo problemem jest tylko ta jedna linijka. Macie pomysł co może powodować tak długie łączenie się z bazą, ewentualnie jak to zoptymalizować?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Ciezko uwierzec ze to to. Bardziej chodzi o to, ze dalej masz jakies dliugie zapytanie ktore poprostu zamula postgresa i nic dziwnego ze kolejne kody maja problem z polaczeniem


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
gargamel
post
Post #3





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


No właśnie też o tym pierwszym pomyślałem, ale czemu zawsze zawiesza się na tym pliku ?

Jeśli wyciągnę kod z klas i zorganizuję go w jednym pliku, to wygląda to tak:

  1. <?php
  2. $dataBaseConnection = new PDO("pgsql:dbname=$db; host=$host", $user, $pass );
  3.  
  4. $sql = "
  5. SELECT
  6. max(modification_marker) AS mm
  7. FROM
  8. c_orders
  9. WHERE
  10. c_complete=:c_complete;";
  11.  
  12. $p = $dataBaseConnection -> prepare( $sql );
  13. $p -> execute( array( ':c_complete' => 1 ) );
  14. $p -> setFetchMode( PDO::FETCH_ASSOC );
  15. $r = $p -> fetch();
  16. $mm = $r['mm']
  17.  
  18. $jsonResp['responce_success'] = false;
  19. $jsonResp['mm'] = 0;
  20.  
  21. if( (int)$mm ) ){
  22. $jsonResp['responce_success'] = true;
  23. $jsonResp['mm'] = $mm;
  24. }
  25.  
  26. echo json_encode($jsonResp);


A więc żadnych wygibasów tu nie ma. Odnośnie jednak zamulania przez jakieś inne zapytanie - jest jakiś sposób żeby rejestrować wykonywane przez bazę zapytania, ich czas wykonania - żeby ewentualnie zlokalizować zapytanie które muli (ale nie na zasadzie pomiaru czasu w metodach które wykonują sql-a, bo to mi zajmie 100 lat ;-) )?




Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Zrob
  1. $dataBaseConnection = new PDO("pgsql:dbname=$db; host=$host", $user, $pass );

I bedziesz wiedzial czy to przez te jedna linijke czy nie wink.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
gargamel
post
Post #5





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


Dawałem:

  1. <?php
  2.  
  3. $t[0] = microtime(true);
  4.  
  5. $dataBaseConnection = new PDO("pgsql:dbname=$db; host=$host", $user, $pass );
  6.  
  7. $t[1] = microtime(true);
  8.  
  9.  
  10. $sql = "
  11. SELECT
  12. max(modification_marker) AS mm
  13. FROM
  14. c_orders
  15. WHERE
  16. c_complete=:c_complete;";
  17.  
  18.  
  19. $p = $dataBaseConnection -> prepare( $sql );
  20.  
  21. $t[2] = microtime(true);
  22.  
  23. $p -> execute( array( ':c_complete' => 1 ) );
  24.  
  25. $t[3] = microtime(true);
  26.  
  27. $p -> setFetchMode( PDO::FETCH_ASSOC );
  28. $r = $p -> fetch();
  29. $mm = $r['mm']
  30.  
  31. $t[4] = microtime(true);
  32.  
  33. $jsonResp['responce_success'] = false;
  34. $jsonResp['mm'] = 0;
  35.  
  36.  
  37.  
  38. if( (int)$mm ) ){
  39. $jsonResp['responce_success'] = true;
  40. $jsonResp['mm'] = $mm;
  41. $jsonResp['time'] = "db_con=". $t[1] - $t[0].', '.
  42. "prepare=". $t[2] - $t[1].', '.
  43. "execute=". $t[3] - $t[2].', '.
  44. "fetch=". $t[4] - $t[3];
  45. }
  46.  
  47. echo json_encode($jsonResp);



Przykładowy wynik: db_con=12.0043, prepare=0.0022, execute=0.0198, fetch=0.0013

Co do drugiego pytania, to widzę że w postgresie można ustawić log_min_duration_statement() i zapisywać zapytania działające określony czas, ale na hostingu taka opcja niestety odpada, więc szukam dalej smile.gif



Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Sprawdz prosze jeszcze ten exit. Bedziesz mial pewnosc czy to to czy nie.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
gargamel
post
Post #7





Grupa: Zarejestrowani
Postów: 278
Pomógł: 35
Dołączył: 25.06.2010

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


Teraz dla odmiany w ogóle nie mogę wywołać sytuacji w której plik się wykonuje dłużej niż 50ms, czy to z exitem, czy bez niego... No nic, zrobię tak jak mówisz i poszukam po innych zapytaniach.

Dzięki za pomoc smile.gif
Go to the top of the page
+Quote Post
Pyton_000
post
Post #8





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


a host to jest po prostu localhost? jeśli tak to zamień to na ip.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 21:49