Zend_Db_Profiler.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. <sect1 id="zend.db.profiler">
  2. <title>Zend_Db_Profiler</title>
  3. <sect2 id="zend.db.profiler.introduction">
  4. <title>Giriş</title>
  5. <para>
  6. <code>Zend_Db_Profiler</code> sorgularınızın profillenmesine imkan
  7. verir. Profiller bağdaştırıcı tarafından işlenen sorguları hem de
  8. sorguları çalıştırmak için geçen süreyi içerir ve gerçekleştirilen
  9. sorguların sınıflarınıza ek hata ayıklama kodu eklemeden incelenmesini
  10. mümkün kılar. Ayrıca gelişmiş kullanım geliştiriciye hangi sorguların
  11. profilleneceğini filtrelemeye izin verir.
  12. </para>
  13. <para>
  14. Profilleyiciyi (profiler'ı) bağdaştırıcı yapıcısına gerekli direktifi vererek
  15. yada bağdaştırıcıdan sonra etkinleştirmesini isteyerek etkinleştirebilirsiniz.
  16. </para>
  17. <programlisting role="php"><![CDATA[<?php
  18. require_once 'Zend/Db.php';
  19. $params = array(
  20. 'host' => '127.0.0.1',
  21. 'username' => 'webuser',
  22. 'password' => 'xxxxxxxx',
  23. 'dbname' => 'test'
  24. 'profiler' => true // profilleyiciyi aç; kapatmak için false yapın (varsayılan)
  25. );
  26. $db = Zend_Db::factory('PDO_MYSQL', $params);
  27. // profilleyiciyi kapat:
  28. $db->getProfiler()->setEnabled(false);
  29. // profilleyiciyi aç:
  30. $db->getProfiler()->setEnabled(true);]]>
  31. </programlisting>
  32. <para>
  33. <code>profiler</code> seçeneğinin değeri esnektir.Tipine göre farklı yorumlanır. Çoğu zaman basit bir boole
  34. değer kullanmalısınız ama diğer tipler profilleyicinin davranışını özelleştirmenizi sağlar.
  35. </para>
  36. <para>
  37. Boole argüman <code>true</code> ise profilleyiciyi etkinleştirir , veya <code>false</code> ise
  38. etkisizleştirir.
  39. Profilleyici sınıfı bağdaştırıcı'nın varsayılan profilleyici sınıfı ,
  40. örneğin <code>Zend_Db_Profiler</code>.
  41. <programlisting role="php"><![CDATA[
  42. $params['profiler'] = true;
  43. $db = Zend_Db::factory('PDO_MYSQL', $params);]]>
  44. </programlisting>
  45. </para>
  46. <para>
  47. Profilleyicinin bir instance'ı bağdaştırıcının o nesneyi kullanmasını sağlar.
  48. Nesne <code>Zend_Db_Profiler</code> veya bu nedenle altsınıf(subclass) tipinde
  49. olmalı.Profilleyicinin etkinleştirilmesi ayrı olarak yapıldı.
  50. <programlisting role="php"><![CDATA[
  51. $profiler = MyProject_Db_Profiler();
  52. $profiler->setEnabled(true);
  53. $params['profiler'] = $profiler;
  54. $db = Zend_Db::factory('PDO_MYSQL', $params);]]>
  55. </programlisting>
  56. </para>
  57. <para>
  58. Argüman '<code>enabled</code>', '<code>instance</code>', ve '<code>class</code>' anahtarlarından herhangi
  59. birini içeren birleşmeli dizi olabilir. '<code>enabled</code>' ve '<code>instance</code>' anahtarları
  60. boole ve yukarıda belgelenen örnek tiplere uyar. '<code>class</code>' anahtarı özel bir profilleyici
  61. kullanmak için bir sınıfı isimlendirmek için kullanılır. Sınıf mutlaka <code>Zend_Db_Profiler</code> veya
  62. altsınıf olmalı. Sınıfın yapıcı argümanları olmadan intance'ı oluşturuldu. '<code>instance</code>' seçeneği
  63. sağlandığında '<code>class</code>' seçeneği gözardı edilir.
  64. <programlisting role="php"><![CDATA[
  65. $params['profiler'] = array(
  66. 'enabled' => true,
  67. 'class' => 'MyProject_Db_Profiler'
  68. );
  69. $db = Zend_Db::factory('PDO_MYSQL', $params);]]>
  70. </programlisting>
  71. </para>
  72. <para>
  73. Son olarak argüman yukarıda açıklandığı gibi dizi anahtarları olarak işlem gören
  74. özellikler içeren <code>Zend_Config</code> tipinin nesnesi olabilir. Örneğin
  75. "config.ini" dosyası takip eden veriyi içerebilir:
  76. <programlisting role="ini"><![CDATA[
  77. [main]
  78. db.profiler.class = "MyProject_Db_Profiler"
  79. db.profiler.enabled = true]]>
  80. </programlisting>
  81. Yapılandırma takip eden PHP kodu ile uygulanabilir:
  82. <programlisting role="php"><![CDATA[
  83. $config = new Zend_Config_Ini('config.ini', 'main');
  84. $params['profiler'] = $config->db->profiler;
  85. $db = Zend_Db::factory('PDO_MYSQL', $params);]]>
  86. </programlisting>
  87. '<code>instance</code>' özelliği aşağıdaki gibi kullanılabilir:
  88. <programlisting role="php"><![CDATA[
  89. $profiler = new MyProject_Db_Profiler();
  90. $profiler->setEnabled(true);
  91. $configData = array(
  92. 'instance' => $profiler
  93. );
  94. $config = new Zend_Config($configData);
  95. $params['profiler'] = $config;
  96. $db = Zend_Db::factory('PDO_MYSQL', $params);]]>
  97. </programlisting>
  98. </para>
  99. </sect2>
  100. <sect2 id="zend.db.profiler.using">
  101. <title>Profilleyiciyi Kullanma</title>
  102. <para>
  103. Herhangi bir noktada bağdaştırıcının <code>getProfiler()</code> metodu
  104. ile profilleyiciyi yakalayın:
  105. </para>
  106. <programlisting role="php"><![CDATA[<?php
  107. $profiler = $db->getProfiler();]]>
  108. </programlisting>
  109. <para>
  110. Bu <code>Zend_Db_Profiler</code> nesnesinin instance'ını döndürür.
  111. Bu instance ile geliştirici çeşitli metodlar ile sorgularınızı gözden geçirebilir:
  112. </para>
  113. <itemizedlist>
  114. <listitem>
  115. <para>
  116. <code>getTotalNumQueries()</code> profillenen sorguların toplam adedini döndürür.
  117. </para>
  118. </listitem>
  119. <listitem>
  120. <para>
  121. <code>getTotalElapsedSecs()</code> profillenen tüm sorgular için geçen toplam süreyi
  122. saniye olarak döndürür.
  123. </para>
  124. </listitem>
  125. <listitem>
  126. <para>
  127. <code>getQueryProfiles()</code> sorgu profillerini dizi olarak döndürür.
  128. </para>
  129. </listitem>
  130. <listitem>
  131. <para>
  132. <code>getLastQueryProfile()</code> sorgunun bitip bitmemesine bakmaksızın
  133. son sorgu profilini döndürür.(Bitmediyse bitiş zamanı null olur)
  134. </para>
  135. </listitem>
  136. <listitem>
  137. <para>
  138. <code>clear()</code> stack'teki eski sorgu profillerini temizler.
  139. </para>
  140. </listitem>
  141. </itemizedlist>
  142. <para>
  143. <code>getLastQueryProfile()</code> 'ın döndürdüğü değer ve <code>getQueryProfiles()</code>'ın
  144. her öğesi her sorgunun kendisiyle denetlenmesini sağlayan <code>Zend_Db_Profiler_Query</code> nesneleridir:
  145. </para>
  146. <itemizedlist>
  147. <listitem>
  148. <para>
  149. <code>getQuery()</code> sorgunun SQL metnini döndürür.
  150. Paremetreleriyle hazırlanmış deyimin SQL metni sorgunun
  151. hazırlandığı zamanki metindir bu yüzden paremetre yer tutucularını
  152. içerir , deyim çalıştırıldığı zamanki değerleri değil.
  153. </para>
  154. </listitem>
  155. <listitem>
  156. <para>
  157. <code>getQueryParams()</code> hazırlanmış sorguları çalıştırırken
  158. kullanılan paremetreleri dizi olarak döndürür. Bu uç paremetreleri ve
  159. deyimin <code>execute()</code> metoduna gelen argümaları içerir.
  160. Dizinin anahtarları konumsaldır ( 1 tabanlı) veya isimlendirilmiş (string)
  161. paremetre indislidir.
  162. </para>
  163. </listitem>
  164. <listitem>
  165. <para>
  166. <code>getElapsedSecs()</code> sorgunun çalıştığı süreyi
  167. saniye olarak döndürür.
  168. </para>
  169. </listitem>
  170. </itemizedlist>
  171. <para>
  172. <code>Zend_Db_Profiler</code>'ın sağladığı bilgi uygulamalardaki darboğazları
  173. profillemede ve çalıştırılan sorgularda hata ayıklamada yararlıdır.
  174. Örneğin , tam olarak son çalıştırılan sorguyu görmek için :
  175. </para>
  176. <programlisting role="php"><![CDATA[<?php
  177. $query = $profiler->getLastQueryProfile();
  178. echo $query->getQuery();]]>
  179. </programlisting>
  180. <para>
  181. Muhtemelen sayfa yavaş oluşturuluyor;ilk önce profilleyici ile tüm sorgular için
  182. toplam kaç saniye harcandığını belirleyin ve en uzun çalışan sorguyu bulmak için
  183. sorguları teker teker kontrol edin:
  184. </para>
  185. <programlisting role="php"><![CDATA[<?php
  186. $totalTime = $profiler->getTotalElapsedSecs();
  187. $queryCount = $profiler->getTotalNumQueries();
  188. $longestTime = 0;
  189. $longestQuery = null;
  190. foreach ($profiler->getQueryProfiles() as $query) {
  191. if ($query->getElapsedSecs() > $longestTime) {
  192. $longestTime = $query->getElapsedSecs();
  193. $longestQuery = $query->getQuery();
  194. }
  195. }
  196. echo $totalTime . ' saniye içinde '. $queryCount .' adet sorgu çalıştırıldı' . "\n";
  197. echo 'Ortalama sorgu süresi : ' . $totalTime / $queryCount . ' saniye' . "\n";
  198. echo 'Saniye başı sorgu sayısı: ' . $queryCount / $totalTime . "\n";
  199. echo 'En uzun sorgu süresi: ' . $longestTime . "\n";
  200. echo "En uzun sorgu: \n" . $longestQuery . "\n";]]>
  201. </programlisting>
  202. </sect2>
  203. <sect2 id="zend.db.profiler.advanced">
  204. <title>İleri Profilleyici Kullanımı</title>
  205. <para>
  206. Sorgu denetlemeye ek olarak , profilleyici geliştiriciye hangi
  207. sorguların profilleneceğini filtrelemeye imkan sağlar. Takip
  208. eden metodlar <code>Zend_Db_Profiler</code> isntance'ında çalışır:
  209. </para>
  210. <sect3 id="zend.db.profiler.advanced.filtertime">
  211. <title>Sorgu için harcanan süreye göre filtreleme</title>
  212. <para>
  213. <code>setFilterElapsedSecs()</code> geliştiriciye sorgunun profillenmesi
  214. için geçmesi gereken mininimum süreyi belirleme imkanı sağlar. Bu filtreyi kaldırmak
  215. için metoda null değer verin.
  216. </para>
  217. <programlisting role="php"><![CDATA[<?php
  218. // Sadece en az 5 saniye süren sorguları profille:
  219. $profiler->setFilterElapsedSecs(5);
  220. // Süresine bakmaksızın tüm sorguları profille:
  221. $profiler->setFilterElapsedSecs(null);]]>
  222. </programlisting>
  223. </sect3>
  224. <sect3 id="zend.db.profiler.advanced.filtertype">
  225. <title>Sorgu tipine göre filtreleme</title>
  226. <para>
  227. <code>setFilterQueryType()</code> geliştiriciye hangi tip sorguların
  228. profilleneceğini bellirleme imkanı verir; birden çok tip profillemek için
  229. mantıksal OR kullanın. Sorgu tipleri takip eden <code>Zend_Db_Profiler</code>
  230. sabitleri tarafından tanımlanmıştır:
  231. </para>
  232. <itemizedlist>
  233. <listitem>
  234. <para>
  235. <code>Zend_Db_Profiler::CONNECT</code>: bağlantı işlemleri veya
  236. veri tabanı seçimi.
  237. </para>
  238. </listitem>
  239. <listitem>
  240. <para>
  241. <code>Zend_Db_Profiler::QUERY</code>: Diğer tiplere uymayan genel
  242. veri tabanı sorguları.
  243. </para>
  244. </listitem>
  245. <listitem>
  246. <para>
  247. <code>Zend_Db_Profiler::INSERT</code>: veri tabanına yeni veri ekleyen
  248. herhangi bir sorgu , genellikle INSERT'li SQL.
  249. </para>
  250. </listitem>
  251. <listitem>
  252. <para>
  253. <code>Zend_Db_Profiler::UPDATE</code>: mevcut veriyi güncelleyen herhangi
  254. bir sorgu , genellikle UPDATE'li SQL.
  255. </para>
  256. </listitem>
  257. <listitem>
  258. <para>
  259. <code>Zend_Db_Profiler::DELETE</code>: mevcut veriyi silen herhangi bir
  260. sorgu , genellikle DELETE'li SQL.
  261. </para>
  262. </listitem>
  263. <listitem>
  264. <para>
  265. <code>Zend_Db_Profiler::SELECT</code>: mevcut veriyi getiren herhangi bir
  266. sorgu , genellikle SELECT'li SQL.
  267. </para>
  268. </listitem>
  269. <listitem>
  270. <para>
  271. <code>Zend_Db_Profiler::TRANSACTION</code>: herhangi hareket işlemi
  272. start transaction , commit veya rollback gibi.
  273. </para>
  274. </listitem>
  275. </itemizedlist>
  276. <para>
  277. <code>setFilterQueryType</code> ile var olan herhangi filtreyi argüman olarak sadece
  278. <code>null</code> vererek kaldırabilirsiniz.
  279. </para>
  280. <programlisting role="php"><![CDATA[<?php
  281. // Sadece SELECT sorgularını profille
  282. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);
  283. // SELECT, INSERT, ve UPDATE sorgularını profille
  284. $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  285. // DELETE sorgularını profille ( böylece verinin neden kaybolmaya devam ettiğini anlayabilelim)
  286. $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);
  287. // Tüml filtreleri kaldır
  288. $profiler->setFilterQueryType(null);]]>
  289. </programlisting>
  290. </sect3>
  291. <sect3 id="zend.db.profiler.advanced.getbytype">
  292. <title>Sorgu tipine göre profillere erişmek</title>
  293. <para>
  294. <code>setFilterQueryType()</code> kullanmak oluşturulan profilleri
  295. azaltabilir.Buna rağmen bazen tüm profilleri tutmak yararlı olabilir ama
  296. bunlara ihtiyacınız olduğu anda bakın. <code>getQueryProfiles()</code> 'ın
  297. bir diğer özelliği ise ilk argüman olarak sorgu tipini (veya sorgu tiplerinin mantıksal kombinasyonu)
  298. vererek bu filtrelemeyi anında yapabilmesidir ; sorgu tipi sabitleri listesi için bakınız
  299. <xref linkend="zend.db.profiler.advanced.filtertype" />.
  300. </para>
  301. <programlisting role="php"><![CDATA[<?php
  302. // Sadece SELECT sorgusu profillerine eriş
  303. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);
  304. // Sadece SELECT, INSERT, and UPDATE sorgusu profillerine eriş
  305. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE);
  306. // DELETE sorgularına eriş ( böylece verinin neden kaybolmaya devam ettiğini
  307. // anlayabilelim)
  308. $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);]]>
  309. </programlisting>
  310. </sect3>
  311. </sect2>
  312. </sect1>
  313. <!--
  314. vim:se ts=4 sw=4 et:
  315. -->