Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Rozszerzenie PDO, Mierzenie czasu wykonania zapytania
adrix88
post 25.06.2011, 15:58:51
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


Witam. Ostatnimi czasy przechodzę powoli z mysql na PDO i jestem w trakcie poznawania tej metody komunikacji z bazą danych. W mysqlu miałem prostą klasę która pozwalała mi na mierzenie czasu wykonywania poszczególnych zapytań, liczenie ich oraz wyświetlanie ich łącznego czasu wykonywania, co jest dla mnie bardzo ważne przy optymalizacji całej aplikacji. Przechodząc na PDO chciałem napisać własną klasę do obsługi tego połączenia, która miałaby spełniać te same funkcje co jej mysqlowy odpowiednik, ale po przeczytaniu kilku opinii na tym forum dowiedziałem się że pisanie klasy do obsługi PDO nie ma sensu, ponieważ samo PDO jest klasą do obsługi połączenia i jest wkompilowane w php, dlatego zamykanie tego we własnej klasie może obniżyć wydajność. Pomyślałem trochę i w sumie chyba znalazłem rozwiązanie swojego problemu. Postanowiłem napisać rozszerzenie klasy PDO, które będzie spełniać powyższe funkcje i będę je includować tylko wtedy gdy chcę mierzyć czasy zapytań. Pogooglowałem trochę i udało mi się napisać taki kod:

  1. class Foo extends PDO {
  2.  
  3. function __construct() {
  4. try {
  5. parent::__construct('mysql:host='.DB_HOST.';dbname='.DB_NAME.';port=3305', DB_USER, DB_PASSWORD, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES ".DB_CHARSET));
  6. $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7. }
  8. catch(Exception $e) {
  9. print "Error: " . $e->getMessage();
  10. }
  11. }
  12.  
  13. function query($query) {
  14. $zapytanie = $query;
  15. $time='';
  16. $time -= microtime(true);
  17. $query = parent::query($query);
  18. $time += microtime(true);
  19. $this->timeall += $time;
  20.  
  21. $this->iQueryCount++;
  22. $this->stats['num']=$this->iQueryCount;
  23. $this->stats['time']=round($this->timeall*1000, 4);
  24. $this->stats['query'][$this->iQueryCount] = 'Zapytanie: '.$zapytanie.' | Czas wykonywania: '.round($time*1000, 4);
  25.  
  26. return $query;
  27. }
  28.  
  29. function prepare($query) {
  30. $zapytanie = $query;
  31. $time='';
  32. $time -= microtime(true);
  33. $query = parent::prepare($query);
  34. $time += microtime(true);
  35. $this->timeall += $time;
  36.  
  37. $this->iQueryCount++;
  38. $this->stats['num']=$this->iQueryCount;
  39. $this->stats['time']=round($this->timeall, 4);
  40. $this->stats['query'][$this->iQueryCount] = 'Zapytanie: '.$zapytanie.' | Czas wykonywania: '.round($time*1000, 4);
  41.  
  42. return $query;
  43. }
  44.  
  45. function query_stats() {
  46. return $this->stats;
  47. }
  48. }


Wszystko działa pięknie i ładnie, ale tylko dla query, w przypadku prepare liczona jest liczba zapytań, ale czas zapytania jest zawsze 0, czyli coś tu jest nie tak, a właśnie najważniejsze jest to żeby liczyć czas zapytań wykonywanych przez prepare, ponieważ jak wiadomo ta metoda wykonywana jest najczęściej. Macie jakieś pomysły jak to rozwiązać?

Ten post edytował adrix88 25.06.2011, 16:04:15
Go to the top of the page
+Quote Post
darko
post 25.06.2011, 17:36:59
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Tak, zacząć mierzyć czas przed wykonaniem metody prepare i skończyć mierzyć po jej wykonaniu. Chyba niepotrzebnie sam sobie komplikujesz życie, a od badania wąskich gardeł aplikacji jest debugger z optymalizatorem.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
adrix88
post 25.06.2011, 18:28:22
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


debugger z optymalizatorem? Możesz mi troszeczkę rozjaśnić temat?
Go to the top of the page
+Quote Post
Fifi209
post 25.06.2011, 18:45:20
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


debugger to np. xdebug

Co do optymalizacji zapytań - rób to po stronie bazy, expain etc.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
adrix88
post 25.06.2011, 20:55:54
Post #5





Grupa: Zarejestrowani
Postów: 45
Pomógł: 1
Dołączył: 16.11.2007

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


xdebugiem się kiedyś bawiłem więc mniej więcej ogarniam ten temat, ale nie do końca wiem co rozumiesz pod pojęciem optymalizacji zapytań po stronie bazy, a słowo expain nic mi tu nie mówi ;>
Go to the top of the page
+Quote Post
Fifi209
post 25.06.2011, 22:14:30
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


W sensie sprawdzenia najwolniejszych zapytań (slow log) co do explain - ciężko poszukać na necie?


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
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 Wersja Lo-Fi Aktualny czas: 18.07.2025 - 04:29