2
0

Zend_Db_Profiler.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: yes -->
  4. <sect1 id="zend.db.profiler" xmlns:xi="http://www.w3.org/2001/XInclude">
  5. <title>Zend_Db_Profiler</title>
  6. <sect2 id="zend.db.profiler.introduction">
  7. <title>Wprowadzenie</title>
  8. <para>
  9. <code>Zend_Db_Profiler</code> może być włączony aby pozwolić na
  10. profilowanie zapytań. Profilowanie umożliwia zbadanie czasu trwania
  11. zapytań pozwalając na inspekcję przeprowadzonych zapytań bez potrzeby
  12. dodawania nadmiarowego kodu do klas. Zaawansowane użycie pozwala także
  13. programiście decydować o tym, jakich typów zapytania mają być profilowane.
  14. </para>
  15. <para>
  16. Włącz profiler przekazując odpowiednią dyrektywę do konstruktora
  17. adaptera lub wywołując później metodę adaptera.
  18. </para>
  19. <programlisting role="php"><![CDATA[
  20. $params = array (
  21. 'host' => '127.0.0.1',
  22. 'username' => 'webuser',
  23. 'password' => 'xxxxxxxx',
  24. 'dbname' => 'test',
  25. 'profiler' => true // włącz profiler; ustaw false aby wyłączyć (domyślne wyłączony)
  26. );
  27. $db = Zend_Db::factory('PDO_MYSQL', $params);
  28. // wyłącz profiler:
  29. $db->getProfiler()->setEnabled(false);
  30. // włącz profiler:
  31. $db->getProfiler()->setEnabled(true);
  32. ]]>
  33. </programlisting>
  34. <para>
  35. Wartość opcji '<code>profiler</code>' jest dość elastyczna. Jest
  36. ona interpretowana zależnie id jej typu. W większości przypadków
  37. powinieneś użyć wartości logicznej, ale inne typy pozwalają na
  38. dostosowanie zachowania profilera do własnych potrzeb.
  39. </para>
  40. <para>
  41. Parametr logiczny włącza profiler jeśli ma wartość
  42. <code>TRUE</code> lub wyłącza jeśli ma wartość <code>FALSE</code>.
  43. Klasą profilera domyślnie jest klasa <code>Zend_Db_Profiler</code>.
  44. <programlisting role="php"><![CDATA[
  45. $params['profiler'] = true;
  46. $db = Zend_Db::factory('PDO_MYSQL', $params);
  47. ]]>
  48. </programlisting>
  49. </para>
  50. <para>
  51. Przekazanie instancji obiektu profilera powoduje jej użycie przez
  52. adapter bazy danych. Musi to być obiekt klasy
  53. <code>Zend_Db_Profiler</code> lub klasy ją rozszerzającej. Aktywacja
  54. profilera odbywa się osobno.
  55. <programlisting role="php"><![CDATA[
  56. $profiler = MyProject_Db_Profiler();
  57. $profiler->setEnabled(true);
  58. $params['profiler'] = $profiler;
  59. $db = Zend_Db::factory('PDO_MYSQL', $params);
  60. ]]>
  61. </programlisting>
  62. </para>
  63. <para>
  64. Argument może być tablicą asocjacyjną zawierającą wszystkie lub
  65. jeden z kluczy '<code>enabled</code>', '<code>instance</code>', oraz
  66. '<code>class</code>'. Klucz '<code>enabled</code>' odpowiada wartości
  67. logicznej, a '<code>instance</code>' wartości instancji, obie są
  68. opisane powyżej. Klucz '<code>class</code>' jest używany do podania
  69. nazwy klasy jaka ma być użyta we własnym profilerze. Musi być to
  70. obiekt klasy <code>Zend_Db_Profiler</code> lub klasy ją rozszerzającej.
  71. Instancja klasy jest tworzona bez żadnych argumentów. Opcja
  72. '<code>class</code>' jest ingorowana jeśli podana jest opcja
  73. '<code>instance</code>'.
  74. <programlisting role="php"><![CDATA[
  75. $params['profiler'] = array(
  76. 'enabled' => true,
  77. 'class' => 'MyProject_Db_Profiler'
  78. );
  79. $db = Zend_Db::factory('PDO_MYSQL', $params);
  80. ]]>
  81. </programlisting>
  82. </para>
  83. <para>
  84. Ostatecznie, argument może być obiektem klasy <code>Zend_Config</code>
  85. zawierającym właściwości, które są traktowane jako klucze tablicy
  86. opisane powyżej. Przykładowo plik "config.ini" może zawierać
  87. następujące dane:
  88. <programlisting role="ini"><![CDATA[
  89. [main]
  90. db.profiler.class = "MyProject_Db_Profiler"
  91. db.profiler.enabled = true
  92. ]]>
  93. </programlisting>
  94. Konfiguracja może być przekazana za pomocą takiego kodu PHP:
  95. <programlisting role="php"><![CDATA[
  96. $config = new Zend_Config_Ini('config.ini', 'main');
  97. $params['profiler'] = $config->db->profiler;
  98. $db = Zend_Db::factory('PDO_MYSQL', $params);
  99. ]]>
  100. </programlisting>
  101. Właściwość '<code>instance</code>' może być użyta w następujący sposób:
  102. <programlisting role="php"><![CDATA[
  103. $profiler = new MyProject_Db_Profiler();
  104. $profiler->setEnabled(true);
  105. $configData = array(
  106. 'instance' => $profiler
  107. );
  108. $config = new Zend_Config($configData);
  109. $params['profiler'] = $config;
  110. $db = Zend_Db::factory('PDO_MYSQL', $params);
  111. ]]>
  112. </programlisting>
  113. </para>
  114. </sect2>
  115. <sect2 id="zend.db.profiler.using">
  116. <title>Użycie profilera</title>
  117. <para>
  118. W dowolnym momencie możesz pobrać profiler używając metody
  119. adaptera <code>getProfiler()</code>:
  120. </para>
  121. <programlisting role="php"><![CDATA[
  122. $profiler = $db->getProfiler();
  123. ]]>
  124. </programlisting>
  125. <para>
  126. Zwraca to instancję <code>Zend_Db_Profiler</code>. Używając tej
  127. instancji programista może zbadać zapytania używając rozmaitych
  128. metod:
  129. </para>
  130. <itemizedlist>
  131. <listitem>
  132. <para>
  133. <code>getTotalNumQueries()</code> zwraca liczbę wszystkich
  134. zapytań które były profilowane.
  135. </para>
  136. </listitem>
  137. <listitem>
  138. <para>
  139. <code>getTotalElapsedSecs()</code> zwraca całkowity czas
  140. trwania profilowanych zapytań.
  141. </para>
  142. </listitem>
  143. <listitem>
  144. <para>
  145. <code>getQueryProfiles()</code> zwraca tablicę wszystkich
  146. profilów zapytań.
  147. </para>
  148. </listitem>
  149. <listitem>
  150. <para>
  151. <code>getLastQueryProfile()</code> zwraca ostatni (najnowszy)
  152. profil zapytania, niezależnie od tego czy zostało ono zakończone czy
  153. nie (jeśli nie zostało, to czas zakończenia będzie miał wartość <constant>NULL</constant>)
  154. </para>
  155. </listitem>
  156. <listitem>
  157. <para>
  158. <code>clear()</code> czyści wszystkie poprzednie profile
  159. zapytań ze stosu.
  160. </para>
  161. </listitem>
  162. </itemizedlist>
  163. <para>
  164. Wartość zwracana przez <code>getLastQueryProfile()</code> oraz
  165. pojedyncze elementy tablicy zwracanej przez <code>getQueryProfiles()</code>
  166. są obiektami <code>Zend_Db_Profiler_Query</code>, które dają możliwość
  167. sprawdzenia osobno każdego zapytania.
  168. </para>
  169. <itemizedlist>
  170. <listitem>
  171. <para>
  172. Metoda <code>getQuery()</code> zwraca tekst SQL zapytania.
  173. Tekst przygotowanego zapytania SQL z parametrami jest
  174. tekstem w takiej postaci w jakiej był on przygotowany, więc
  175. zawiera on etykiety, a nie wartości użyte podczas wykonania
  176. zapytania.
  177. </para>
  178. </listitem>
  179. <listitem>
  180. <para>
  181. Metoda <code>getQueryParams()</code> zwraca tablicę wartości
  182. parametrów użytych podczas wykonania przygotowanego
  183. zapytania. Odnosi się to do parametrów oraz do argumentów
  184. metody <code>execute()</code>. Klucze tablicy są oparte na
  185. pozycji (od 1 w górę) lub nazwane (łańcuchy znaków).
  186. </para>
  187. </listitem>
  188. <listitem>
  189. <para>
  190. Metoda <code>getElapsedSecs()</code> zwraca czas trwania zapytania
  191. </para>
  192. </listitem>
  193. </itemizedlist>
  194. <para>
  195. Informacja której dostarcza <code>Zend_Db_Profiler</code> jest
  196. użyteczna przy profilowaniu wąskich gardeł w aplikacjach oraz
  197. do szukania błędów w wykonanych zapytaniach. Na przykład aby
  198. zobaczyć ostatnie zapytanie jakie było wykonane:
  199. </para>
  200. <programlisting role="php"><![CDATA[
  201. $query = $profiler->getLastQueryProfile();
  202. echo $query->getQuery();
  203. ]]>
  204. </programlisting>
  205. <para>
  206. Możliwe, że strona generuje się powoli; użyj profilera aby ustalić
  207. czas wykonania wszystkich zapytań, a następnie przejść poprzez
  208. zapytania aby znaleść te, które trwało najdłużej:
  209. </para>
  210. <programlisting role="php"><![CDATA[
  211. $totalTime = $profiler->getTotalElapsedSecs();
  212. $queryCount = $profiler->getTotalNumQueries();
  213. $longestTime = 0;
  214. $longestQuery = null;
  215. foreach ($profiler->getQueryProfiles() as $query) {
  216. if ($query->getElapsedSecs() > $longestTime) {
  217. $longestTime = $query->getElapsedSecs();
  218. $longestQuery = $query->getQuery();
  219. }
  220. }
  221. echo 'Wykonano ' . $queryCount . ' zapytań w czasie ' . $totalTime . ' sekund' . "\n";
  222. echo 'Średni czas trwania zapytania: ' . $totalTime / $queryCount . ' sekund' . "\n";
  223. echo 'Zapytań na sekundę:: ' . $queryCount / $totalTime . "\n";
  224. echo 'Czas trwania najdłuższego zapytania: ' . $longestTime . "\n";
  225. echo "Najdłuższe zapytanie: \n" . $longestQuery . "\n";
  226. ]]>
  227. </programlisting>
  228. </sect2>
  229. <sect2 id="zend.db.profiler.advanced">
  230. <title>Zaawansowane użycie profilera</title>
  231. <para>
  232. Oprócz sprawdzania zapytań, profiler pozwala także programiście na
  233. określenie typów zapytań które mają być profilowane. Poniższe
  234. metody operują na instancji <code>Zend_Db_Profiler</code>:
  235. </para>
  236. <sect3 id="zend.db.profiler.advanced.filtertime">
  237. <title>Filtrowanie ze względu na czas trwania zapytania</title>
  238. <para>
  239. <code>setFilterElapsedSecs()</code> pozwala programiście ustalić
  240. minimalny czas trwania zapytania jaki jest potrzebny do tego by
  241. zostało ono profilowane. Aby usunąć filtr, wywołaj metodę z
  242. wartością null w parametrze.
  243. </para>
  244. <programlisting role="php"><![CDATA[
  245. // Profiluj tylko zapytania które trwają przynajmniej 5 sekund:
  246. $profiler->setFilterElapsedSecs(5);
  247. // Profiluj wszystkie zapytania, niezależnie od czasu ich trwania:
  248. $profiler->setFilterElapsedSecs(null);
  249. ]]>
  250. </programlisting>
  251. </sect3>
  252. <sect3 id="zend.db.profiler.advanced.filtertype">
  253. <title>Filtrowanie ze względu na typ zapytania</title>
  254. <para>
  255. <code>setFilterQueryType()</code> pozwala programiście określić,
  256. które typy zapytań powinny być profilowane; aby profilować
  257. zapytania wielu typów użyj logicznego operatora OR. Typy zapytań
  258. są zdefiniowane jako stałe w <code>Zend_Db_Profiler</code>:
  259. </para>
  260. <itemizedlist>
  261. <listitem>
  262. <para>
  263. <code>Zend_Db_Profiler::CONNECT</code>: operacje
  264. połączenia lub wybierania bazy danych.
  265. </para>
  266. </listitem>
  267. <listitem>
  268. <para>
  269. <code>Zend_Db_Profiler::QUERY</code>: ogólne zapytania
  270. które nie pasują do pozostałych typów.
  271. </para>
  272. </listitem>
  273. <listitem>
  274. <para>
  275. <code>Zend_Db_Profiler::INSERT</code>: każde zapytanie
  276. które wstawia nowe dane do bazy, generalnie SQL INSERT.
  277. </para>
  278. </listitem>
  279. <listitem>
  280. <para>
  281. <code>Zend_Db_Profiler::UPDATE</code>: każde zapytanie
  282. ktore uaktualnia dane w bazie, najczęściej SQL UPDATE.
  283. </para>
  284. </listitem>
  285. <listitem>
  286. <para>
  287. <code>Zend_Db_Profiler::DELETE</code>: każde zapytanie
  288. które usuwa istnięjące dane, najczęściej SQL DELETE.
  289. </para>
  290. </listitem>
  291. <listitem>
  292. <para>
  293. <code>Zend_Db_Profiler::SELECT</code>: każde zapytanie
  294. które pobiera istnięjące dane, najczęściej SQL SELECT.
  295. </para>
  296. </listitem>
  297. <listitem>
  298. <para>
  299. <code>Zend_Db_Profiler::TRANSACTION</code>: każda
  300. operacja transakcyjna, taka jak start transakcji, potwierdzenie
  301. zmian czy ich cofnięcie.
  302. </para>
  303. </listitem>
  304. </itemizedlist>
  305. <para>
  306. Analogicznie jak w metodzie <code>setFilterElapsedSecs()</code>,
  307. możesz usunąć wszystkie istniejące filtry przekazując metodzie
  308. pusty parametr <code>null</code>.
  309. </para>
  310. <programlisting role="php"><![CDATA[
  311. // profiluj tylko zapytania SELECT
  312. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
  313. // profiluj zapytania SELECT, INSERT, oraz UPDATE
  314. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  315. // profiluj zapytania DELETE
  316. $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
  317. // Usuń wszystkie filtry
  318. $profiler->setFilterQueryType(null);
  319. ]]>
  320. </programlisting>
  321. </sect3>
  322. <sect3 id="zend.db.profiler.advanced.getbytype">
  323. <title>Pobieranie profili na podstawie typów zapytań</title>
  324. <para>
  325. Użycie metody <code>setFilterQueryType()</code> może zmniejszyć
  326. ilość wygenerowanych profili. Jakkolwiek, czasem bardziej użyteczne
  327. jest przechowywanie wszystkich profili i wyświetlanie tylko
  328. tych których potrzebujesz w danym momencie. Inną funkcjonalnością
  329. metody <code>getQueryProfiles()</code> jest to, że może ona
  330. przeprowadzić te filtrowanie w locie, po przekazaniu typu
  331. zapytań (lub logicznej kombinacji typów zapytań) jako pierwszego
  332. argumentu; przejdź do <xref linkend="zend.db.profiler.advanced.filtertype" />
  333. aby zobaczyć listę stałych określających typy zapytań.
  334. </para>
  335. <programlisting role="php"><![CDATA[
  336. // Pobierz jedynie profile zapytań SELECT
  337. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
  338. // Pobierz jedynie profile zapytań SELECT, INSERT, oraz UPDATE
  339. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  340. // Pobierz jedynie profile zapytań DELETE
  341. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);
  342. ]]>
  343. </programlisting>
  344. </sect3>
  345. </sect2>
  346. <sect2 id="zend.db.profiler.profilers">
  347. <title>Wyspecjalizowane profilery</title>
  348. <para>
  349. Wyspecjalizowany profiler jest obiektem klasy dziedziczącej po
  350. klasie <code>Zend_Db_Profiler</code>. Wyspecjalizowane profilery
  351. traktują profilowane informacje w szczególny sposób.
  352. </para>
  353. <xi:include href="Zend_Db_Profiler-Firebug.xml">
  354. <xi:fallback><xi:include href="../../en/module_specs/Zend_Db_Profiler-Firebug.xml" /></xi:fallback>
  355. </xi:include>
  356. </sect2>
  357. </sect1>