[MANUAL] English:
[zend.git] / documentation / manual / pl / module_specs / Zend_Db_Profiler.xml
blobf124d03c356e9f61aef71195c1e4eb8cf753ed89
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>
9         <para>
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.
15         </para>
17         <para>
18             Włącz profiler przekazując odpowiednią dyrektywę do konstruktora
19             adaptera, lub wywołując później metodę adaptera.
20         </para>
22         <programlisting role="php"><![CDATA[
23 $params = array (
24     'host'     => '127.0.0.1',
25     'username' => 'webuser',
26     'password' => 'xxxxxxxx',
27     'dbname'   => 'test',
28     'profiler' => true  // włącz profiler; ustaw false aby wyłączyć (domyślne wyłączony)
31 $db = Zend_Db::factory('PDO_MYSQL', $params);
33 // wyłącz profiler:
34 $db->getProfiler()->setEnabled(false);
36 // włącz profiler:
37 $db->getProfiler()->setEnabled(true);
38 ]]>
39         </programlisting>
41         <para>
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.
46         </para>
48         <para>
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);
55 ]]>
56             </programlisting>
57         </para>
59         <para>
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);
69 ]]>
70             </programlisting>
71         </para>
73         <para>
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(
86     'enabled' => true,
87     'class'   => 'MyProject_Db_Profiler'
89 $db = Zend_Db::factory('PDO_MYSQL', $params);
90 ]]>
91             </programlisting>
92         </para>
94         <para>
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ć
98             następujące dane:
99             <programlisting role="ini"><![CDATA[
100 [main]
101 db.profiler.class   = "MyProject_Db_Profiler"
102 db.profiler.enabled = true
104             </programlisting>
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);
113             </programlisting>
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);
119 $configData = array(
120     'instance' => $profiler
122 $config = new Zend_Config($configData);
123 $params['profiler'] = $config;
124 $db = Zend_Db::factory('PDO_MYSQL', $params);
126             </programlisting>
128         </para>
130     </sect2>
132     <sect2 id="zend.db.profiler.using">
134         <title>Użycie profilera</title>
136         <para>
137             W dowolnym momencie możesz pobrać profiler używając metody
138             adaptera <code>getProfiler()</code>:
139         </para>
141         <programlisting role="php"><![CDATA[
142 $profiler = $db->getProfiler();
144         </programlisting>
146         <para>
147             Zwraca to instancję <code>Zend_Db_Profiler</code>. Używając tej
148             instancji programista może zbadać zapytania używając rozmaitych
149             metod:
150         </para>
152         <itemizedlist>
153             <listitem>
154                 <para>
155                     <code>getTotalNumQueries()</code> zwraca liczbę wszystkich
156                     zapytań które były profilowane.
157                 </para>
158             </listitem>
159             <listitem>
160                 <para>
161                     <code>getTotalElapsedSecs()</code> zwraca całkowity czas
162                     trwania profilowanych zapytań.
163                 </para>
164             </listitem>
165             <listitem>
166                 <para>
167                     <code>getQueryProfiles()</code> zwraca tablicę wszystkich
168                     profilów zapytań.
169                 </para>
170             </listitem>
171             <listitem>
172                 <para>
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)
176                 </para>
177             </listitem>
178             <listitem>
179                 <para>
180                     <code>clear()</code> czyści wszystkie poprzednie profile
181                     zapytań ze stosu.
182                 </para>
183             </listitem>
184         </itemizedlist>
186         <para>
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.
191         </para>
193         <itemizedlist>
194             <listitem>
195                 <para>
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
200                     zapytania.
201                 </para>
202             </listitem>
203             <listitem>
204                 <para>
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).
210                 </para>
211             </listitem>
212             <listitem>
213                 <para>
214                     Metoda <code>getElapsedSecs()</code> zwraca czas trwania zapytania
215                 </para>
216             </listitem>
217         </itemizedlist>
219         <para>
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:
224         </para>
226         <programlisting role="php"><![CDATA[
227 $query = $profiler->getLastQueryProfile();
229 echo $query->getQuery();
231         </programlisting>
233         <para>
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:
237         </para>
239         <programlisting role="php"><![CDATA[
240 $totalTime    = $profiler->getTotalElapsedSecs();
241 $queryCount   = $profiler->getTotalNumQueries();
242 $longestTime  = 0;
243 $longestQuery = null;
245 foreach ($profiler->getQueryProfiles() as $query) {
246     if ($query->getElapsedSecs() > $longestTime) {
247         $longestTime  = $query->getElapsedSecs();
248         $longestQuery = $query->getQuery();
249     }
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";
258         </programlisting>
260     </sect2>
262     <sect2 id="zend.db.profiler.advanced">
264         <title>Zaawansowane użycie profilera</title>
266         <para>
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>:
270         </para>
272         <sect3 id="zend.db.profiler.advanced.filtertime">
273             <title>Filtrowanie ze względu na czas trwania zapytania</title>
275             <para>
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.
280             </para>
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);
289             </programlisting>
290         </sect3>
292         <sect3 id="zend.db.profiler.advanced.filtertype">
293             <title>Filtrowanie ze względu na typ zapytania</title>
295             <para>
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>:
300             </para>
302             <itemizedlist>
303                 <listitem>
304                     <para>
305                         <code>Zend_Db_Profiler::CONNECT</code>: operacje
306                         połączenia lub wybierania bazy danych.
307                     </para>
308                 </listitem>
309                 <listitem>
310                     <para>
311                         <code>Zend_Db_Profiler::QUERY</code>: ogólne zapytania
312                          które nie pasują do pozostałych typów.
313                     </para>
314                 </listitem>
315                 <listitem>
316                     <para>
317                         <code>Zend_Db_Profiler::INSERT</code>: każde zapytanie
318                         które wstawia nowe dane do bazy, generalnie SQL INSERT.
319                     </para>
320                 </listitem>
321                 <listitem>
322                     <para>
323                         <code>Zend_Db_Profiler::UPDATE</code>: każde zapytanie
324                         ktore uaktualnia dane w bazie, najczęściej SQL UPDATE.
325                     </para>
326                 </listitem>
327                 <listitem>
328                     <para>
329                         <code>Zend_Db_Profiler::DELETE</code>: każde zapytanie
330                         które usuwa istnięjące dane, najczęściej SQL DELETE.
331                     </para>
332                 </listitem>
333                 <listitem>
334                     <para>
335                         <code>Zend_Db_Profiler::SELECT</code>: każde zapytanie
336                         które pobiera istnięjące dane, najczęściej SQL SELECT.
337                     </para>
338                 </listitem>
339                 <listitem>
340                     <para>
341                         <code>Zend_Db_Profiler::TRANSACTION</code>: każda
342                         operacja transakcyjna, taka jak start transakcji, potwierdzenie
343                         zmian czy ich cofnięcie.
344                     </para>
345                 </listitem>
346             </itemizedlist>
348             <para>
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>.
352             </para>
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);
367             </programlisting>
369         </sect3>
371         <sect3 id="zend.db.profiler.advanced.getbytype">
372             <title>Pobieranie profili na podstawie typów zapytań</title>
374             <para>
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ń.
384             </para>
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);
396             </programlisting>
398         </sect3>
400     </sect2>
402     <sect2 id="zend.db.profiler.profilers">
403         <title>Wyspecjalizowane profilery</title>
405         <para>
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.
409         </para>
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>
413         </xi:include>
415     </sect2>
417 </sect1>