Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Długi czas łączenia się z bazą
Forum PHP.pl > Forum > Bazy danych
gargamel
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ć?
nospor
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
gargamel
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 ;-) )?




nospor
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
gargamel
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



nospor
Sprawdz prosze jeszcze ten exit. Bedziesz mial pewnosc czy to to czy nie.
gargamel
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
Pyton_000
a host to jest po prostu localhost? jeśli tak to zamień to na ip.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.