1 <sect1 id="zend.db.profiler" xmlns:xi="http://www.w3.org/2001/XInclude">
3 <title>Zend_Db_Profiler</title>
5 <sect2 id="zend.db.profiler.introduction">
7 <title>Wprowadzenie</title>
10 <code>Zend_Db_Profiler</code> może być włączony aby pozwolić na
11 profilowanie zapytań. Profilowanie umożliwia zbadanie czasu trwania
12 zapytań pozwalając na inspekcję przeprowadzonych zapytań bez potrzeby
13 dodawania dodatkowego kodu do klas. Zaawansowane użycie pozwala także
14 programiście decydować o tym, jakich typów zapytania mają być profilowane.
18 Włącz profiler przekazując odpowiednią dyrektywę do konstruktora
19 adaptera, lub wywołując później metodę adaptera.
22 <programlisting role="php"><![CDATA[
24 'host' => '127.0.0.1',
25 'username' => 'webuser',
26 'password' => 'xxxxxxxx',
28 'profiler' => true // włącz profiler; ustaw false aby wyłączyć (domyślne wyłączony)
31 $db = Zend_Db::factory('PDO_MYSQL', $params);
34 $db->getProfiler()->setEnabled(false);
37 $db->getProfiler()->setEnabled(true);
42 Wartość opcji '<code>profiler</code>' jest dość elastyczna. Jest
43 ona interpretowana zależnie id jej typu. W większości przypadków
44 powinieneś użyć wartości logicznej, ale inne typy pozwalają na
45 dostosowanie zachowania profilera do własnych potrzeb.
49 Parametr logiczny włącza profiler jeśli ma wartość
50 <code>true</code>, lub wyłącza jeśli ma wartość <code>false</code>.
51 Klasą profilera domyślnie jest klasa <code>Zend_Db_Profiler</code>.
52 <programlisting role="php"><![CDATA[
53 $params['profiler'] = true;
54 $db = Zend_Db::factory('PDO_MYSQL', $params);
60 Przekazanie instancji obiektu profilera powoduje jej użycie przez
61 sterownik bazy danych. Musi to być obiekt klasy
62 <code>Zend_Db_Profiler</code> lub klasy ją rozszerzającej. Aktywacja
63 profilera odbywa się osobno.
64 <programlisting role="php"><![CDATA[
65 $profiler = MyProject_Db_Profiler();
66 $profiler->setEnabled(true);
67 $params['profiler'] = $profiler;
68 $db = Zend_Db::factory('PDO_MYSQL', $params);
74 Argument może być tablicą asocjacyjną zawierającą wszystkie lub
75 jeden z kluczy '<code>enabled</code>', '<code>instance</code>', oraz
76 '<code>class</code>'. Klucz '<code>enabled</code>' odpowiada wartości
77 logicznej, a '<code>instance</code>' wartości instancji, obie są
78 opisane powyżej. Klucz '<code>class</code>' jest używany do podania
79 nazwy klasy jaka ma być użyta we własnym profilerze. Musi być to
80 obiekt klasy <code>Zend_Db_Profiler</code> lub klasy ją rozszerzającej.
81 Instancja klasy jest tworzona bez żadnych argumentów. Opcja
82 '<code>class</code>' jest ingorowana jeśli podana jest opcja
83 '<code>instance</code>'.
84 <programlisting role="php"><![CDATA[
85 $params['profiler'] = array(
87 'class' => 'MyProject_Db_Profiler'
89 $db = Zend_Db::factory('PDO_MYSQL', $params);
95 Ostatecznie, argument może być obiektem klasy <code>Zend_Config</code>
96 zawierającym właściwości, które są traktowane jako klucze tablicy
97 opisane powyżej. Przykładowo plik "config.ini" może zawierać
99 <programlisting role="ini"><![CDATA[
101 db.profiler.class = "MyProject_Db_Profiler"
102 db.profiler.enabled = true
106 Konfiguracja może być przekazana za pomocą takiego kodu PHP:
108 <programlisting role="php"><![CDATA[
109 $config = new Zend_Config_Ini('config.ini', 'main');
110 $params['profiler'] = $config->db->profiler;
111 $db = Zend_Db::factory('PDO_MYSQL', $params);
115 Właściwość '<code>instance</code>' może być użyta w następujący sposób:
116 <programlisting role="php"><![CDATA[
117 $profiler = new MyProject_Db_Profiler();
118 $profiler->setEnabled(true);
120 'instance' => $profiler
122 $config = new Zend_Config($configData);
123 $params['profiler'] = $config;
124 $db = Zend_Db::factory('PDO_MYSQL', $params);
132 <sect2 id="zend.db.profiler.using">
134 <title>Użycie profilera</title>
137 W dowolnym momencie możesz pobrać profiler używając metody
138 adaptera <code>getProfiler()</code>:
141 <programlisting role="php"><![CDATA[
142 $profiler = $db->getProfiler();
147 Zwraca to instancję <code>Zend_Db_Profiler</code>. Używając tej
148 instancji programista może zbadać zapytania używając rozmaitych
155 <code>getTotalNumQueries()</code> zwraca liczbę wszystkich
156 zapytań które były profilowane.
161 <code>getTotalElapsedSecs()</code> zwraca całkowity czas
162 trwania profilowanych zapytań.
167 <code>getQueryProfiles()</code> zwraca tablicę wszystkich
173 <code>getLastQueryProfile()</code> zwraca ostatni (najnowszy)
174 profil zapytania, niezależnie od tego czy zostało ono zakończone czy
175 nie (jeśli nie zostało, to czas zakończenia będzie miał wartość null)
180 <code>clear()</code> czyści wszystkie poprzednie profile
187 Wartość zwracana przez <code>getLastQueryProfile()</code> oraz
188 pojedyncze elementy tablicy zwracanej przez <code>getQueryProfiles()</code>
189 są obiektami <code>Zend_Db_Profiler_Query</code>, które dają możliwość
190 sprawdzenia osobno każdego zapytania.
196 Metoda <code>getQuery()</code> zwraca tekst SQL zapytania.
197 Tekst przygotowanego zapytania SQL z parametrami jest
198 tekstem w takiej postaci w jakiej był on przygotowany, więc
199 zawiera on etykiety, a nie wartości użyte podczas wykonania
205 Metoda <code>getQueryParams()</code> zwraca tablicę wartości
206 parametrów użytych podczas wykonania przygotowanego
207 zapytania. Odnosi się to do parametrów oraz do argumentów
208 metody <code>execute()</code>. Klucze tablicy są oparte na
209 pozycji (od 1 w górę) lub nazwane (łańcuchy znaków).
214 Metoda <code>getElapsedSecs()</code> zwraca czas trwania zapytania
220 Informacja której dostarcza <code>Zend_Db_Profiler</code> jest
221 użyteczna przy profilowaniu wąskich gardeł w aplikacjach oraz
222 do szukania błędów w wykonanych zapytaniach. Na przykład aby
223 zobaczyć ostatnie zapytanie jakie było wykonane:
226 <programlisting role="php"><![CDATA[
227 $query = $profiler->getLastQueryProfile();
229 echo $query->getQuery();
234 Możliwe, że strona generuje się powoli; użyj profilera aby ustalić
235 czas wykonania wszystkich zapytań, a następnie przejść poprzez
236 zapytania aby znaleść te, które trwało najdłużej:
239 <programlisting role="php"><![CDATA[
240 $totalTime = $profiler->getTotalElapsedSecs();
241 $queryCount = $profiler->getTotalNumQueries();
243 $longestQuery = null;
245 foreach ($profiler->getQueryProfiles() as $query) {
246 if ($query->getElapsedSecs() > $longestTime) {
247 $longestTime = $query->getElapsedSecs();
248 $longestQuery = $query->getQuery();
252 echo 'Wykonano ' . $queryCount . ' zapytań w czasie ' . $totalTime . ' sekund' . "\n";
253 echo 'Średni czas trwania zapytania: ' . $totalTime / $queryCount . ' sekund' . "\n";
254 echo 'Zapytań na sekundę:: ' . $queryCount / $totalTime . "\n";
255 echo 'Czas trwania najdłuższego zapytania: ' . $longestTime . "\n";
256 echo "Najdłuższe zapytanie: \n" . $longestQuery . "\n";
262 <sect2 id="zend.db.profiler.advanced">
264 <title>Zaawansowane użycie profilera</title>
267 Oprócz sprawdzania zapytań, profiler pozwala także programiście na
268 określenie typów zapytań które mają być profilowane. Poniższe
269 metody operują na instancji <code>Zend_Db_Profiler</code>:
272 <sect3 id="zend.db.profiler.advanced.filtertime">
273 <title>Filtrowanie ze względu na czas trwania zapytania</title>
276 <code>setFilterElapsedSecs()</code> pozwala programiście ustalić
277 minimalny czas trwania zapytania jaki jest potrzebny do tego by
278 zostało ono profilowane. Aby usunąć filtr, wywołaj metodę z
279 wartością null w parametrze.
282 <programlisting role="php"><![CDATA[
283 // Profiluj tylko zapytania które trwają przynajmniej 5 sekund:
284 $profiler->setFilterElapsedSecs(5);
286 // Profiluj wszystkie zapytania, niezależnie od czasu ich trwania:
287 $profiler->setFilterElapsedSecs(null);
292 <sect3 id="zend.db.profiler.advanced.filtertype">
293 <title>Filtrowanie ze względu na typ zapytania</title>
296 <code>setFilterQueryType()</code> pozwala programiście określić,
297 które typy zapytań powinny być profilowane; aby profilować
298 zapytania wielu typów użyj logicznego operatora OR. Typy zapytań
299 są zdefiniowane jako stałe w <code>Zend_Db_Profiler</code>:
305 <code>Zend_Db_Profiler::CONNECT</code>: operacje
306 połączenia lub wybierania bazy danych.
311 <code>Zend_Db_Profiler::QUERY</code>: ogólne zapytania
312 które nie pasują do pozostałych typów.
317 <code>Zend_Db_Profiler::INSERT</code>: każde zapytanie
318 które wstawia nowe dane do bazy, generalnie SQL INSERT.
323 <code>Zend_Db_Profiler::UPDATE</code>: każde zapytanie
324 ktore uaktualnia dane w bazie, najczęściej SQL UPDATE.
329 <code>Zend_Db_Profiler::DELETE</code>: każde zapytanie
330 które usuwa istnięjące dane, najczęściej SQL DELETE.
335 <code>Zend_Db_Profiler::SELECT</code>: każde zapytanie
336 które pobiera istnięjące dane, najczęściej SQL SELECT.
341 <code>Zend_Db_Profiler::TRANSACTION</code>: każda
342 operacja transakcyjna, taka jak start transakcji, potwierdzenie
343 zmian czy ich cofnięcie.
349 Analogicznie jak w metodzie <code>setFilterElapsedSecs()</code>,
350 możesz usunąć wszystkie istniejące filtry przekazując metodzie
351 pusty parametr <code>null</code>.
354 <programlisting role="php"><![CDATA[
355 // profiluj tylko zapytania SELECT
356 $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
358 // profiluj zapytania SELECT, INSERT, oraz UPDATE
359 $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
361 // profiluj zapytania DELETE
362 $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
364 // Usuń wszystkie filtry
365 $profiler->setFilterQueryType(null);
371 <sect3 id="zend.db.profiler.advanced.getbytype">
372 <title>Pobieranie profili na podstawie typów zapytań</title>
375 Użycie metody <code>setFilterQueryType()</code> może zmniejszyć
376 ilość wygenerowanych profili. Jakkolwiek, czasem bardziej użyteczne
377 jest przechowywanie wszystkich profili i wyświetlanie tylko
378 tych których potrzebujesz w danym momencie. Inną funkcjonalnością
379 metody <code>getQueryProfiles()</code> jest to, że może ona
380 przeprowadzić te filtrowanie w locie, po przekazaniu typu
381 zapytań (lub logicznej kombinacji typów zapytań) jako pierwszego
382 argumentu; przejdź do <xref linkend="zend.db.profiler.advanced.filtertype" />
383 aby zobaczyć listę stałych określających typy zapytań.
386 <programlisting role="php"><![CDATA[
387 // Pobierz jedynie profile zapytań SELECT
388 $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
390 // Pobierz jedynie profile zapytań SELECT, INSERT, oraz UPDATE
391 $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
393 // Pobierz jedynie profile zapytań DELETE
394 $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);
402 <sect2 id="zend.db.profiler.profilers">
403 <title>Wyspecjalizowane profilery</title>
406 Wyspecjalizowany profiler jest obiektem klasy dziedziczącej po
407 klasie <code>Zend_Db_Profiler</code>. Wyspecjalizowane profilery
408 traktują profilowane informacje w szczególny sposób.
411 <xi:include href="Zend_Db_Profiler-Firebug.xml">
412 <xi:fallback><xi:include href="../../en/module_specs/Zend_Db_Profiler-Firebug.xml" /></xi:fallback>