Zend_Db_Profiler Giriş Zend_Db_Profiler sorgularınızın profillenmesine imkan verir. Profiller bağdaştırıcı tarafından işlenen sorguları hem de sorguları çalıştırmak için geçen süreyi içerir ve gerçekleştirilen sorguların sınıflarınıza ek hata ayıklama kodu eklemeden incelenmesini mümkün kılar. Ayrıca gelişmiş kullanım geliştiriciye hangi sorguların profilleneceğini filtrelemeye izin verir. Profilleyiciyi (profiler'ı) bağdaştırıcı yapıcısına gerekli direktifi vererek yada bağdaştırıcıdan sonra etkinleştirmesini isteyerek etkinleştirebilirsiniz. '127.0.0.1', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test' 'profiler' => true // profilleyiciyi aç; kapatmak için false yapın (varsayılan) ); $db = Zend_Db::factory('PDO_MYSQL', $params); // profilleyiciyi kapat: $db->getProfiler()->setEnabled(false); // profilleyiciyi aç: $db->getProfiler()->setEnabled(true);]]> profiler seçeneğinin değeri esnektir.Tipine göre farklı yorumlanır. Çoğu zaman basit bir boole değer kullanmalısınız ama diğer tipler profilleyicinin davranışını özelleştirmenizi sağlar. Boole argüman true ise profilleyiciyi etkinleştirir , veya false ise etkisizleştirir. Profilleyici sınıfı bağdaştırıcı'nın varsayılan profilleyici sınıfı , örneğin Zend_Db_Profiler. Profilleyicinin bir instance'ı bağdaştırıcının o nesneyi kullanmasını sağlar. Nesne Zend_Db_Profiler veya bu nedenle altsınıf(subclass) tipinde olmalı.Profilleyicinin etkinleştirilmesi ayrı olarak yapıldı. setEnabled(true); $params['profiler'] = $profiler; $db = Zend_Db::factory('PDO_MYSQL', $params);]]> Argüman 'enabled', 'instance', ve 'class' anahtarlarından herhangi birini içeren birleşmeli dizi olabilir. 'enabled' ve 'instance' anahtarları boole ve yukarıda belgelenen örnek tiplere uyar. 'class' anahtarı özel bir profilleyici kullanmak için bir sınıfı isimlendirmek için kullanılır. Sınıf mutlaka Zend_Db_Profiler veya altsınıf olmalı. Sınıfın yapıcı argümanları olmadan intance'ı oluşturuldu. 'instance' seçeneği sağlandığında 'class' seçeneği gözardı edilir. true, 'class' => 'MyProject_Db_Profiler' ); $db = Zend_Db::factory('PDO_MYSQL', $params);]]> Son olarak argüman yukarıda açıklandığı gibi dizi anahtarları olarak işlem gören özellikler içeren Zend_Config tipinin nesnesi olabilir. Örneğin "config.ini" dosyası takip eden veriyi içerebilir: Yapılandırma takip eden PHP kodu ile uygulanabilir: db->profiler; $db = Zend_Db::factory('PDO_MYSQL', $params);]]> 'instance' özelliği aşağıdaki gibi kullanılabilir: setEnabled(true); $configData = array( 'instance' => $profiler ); $config = new Zend_Config($configData); $params['profiler'] = $config; $db = Zend_Db::factory('PDO_MYSQL', $params);]]> Profilleyiciyi Kullanma Herhangi bir noktada bağdaştırıcının getProfiler() metodu ile profilleyiciyi yakalayın: getProfiler();]]> Bu Zend_Db_Profiler nesnesinin instance'ını döndürür. Bu instance ile geliştirici çeşitli metodlar ile sorgularınızı gözden geçirebilir: getTotalNumQueries() profillenen sorguların toplam adedini döndürür. getTotalElapsedSecs() profillenen tüm sorgular için geçen toplam süreyi saniye olarak döndürür. getQueryProfiles() sorgu profillerini dizi olarak döndürür. getLastQueryProfile() sorgunun bitip bitmemesine bakmaksızın son sorgu profilini döndürür.(Bitmediyse bitiş zamanı null olur) clear() stack'teki eski sorgu profillerini temizler. getLastQueryProfile() 'ın döndürdüğü değer ve getQueryProfiles()'ın her öğesi her sorgunun kendisiyle denetlenmesini sağlayan Zend_Db_Profiler_Query nesneleridir: getQuery() sorgunun SQL metnini döndürür. Paremetreleriyle hazırlanmış deyimin SQL metni sorgunun hazırlandığı zamanki metindir bu yüzden paremetre yer tutucularını içerir , deyim çalıştırıldığı zamanki değerleri değil. getQueryParams() hazırlanmış sorguları çalıştırırken kullanılan paremetreleri dizi olarak döndürür. Bu uç paremetreleri ve deyimin execute() metoduna gelen argümaları içerir. Dizinin anahtarları konumsaldır ( 1 tabanlı) veya isimlendirilmiş (string) paremetre indislidir. getElapsedSecs() sorgunun çalıştığı süreyi saniye olarak döndürür. Zend_Db_Profiler'ın sağladığı bilgi uygulamalardaki darboğazları profillemede ve çalıştırılan sorgularda hata ayıklamada yararlıdır. Örneğin , tam olarak son çalıştırılan sorguyu görmek için : getLastQueryProfile(); echo $query->getQuery();]]> Muhtemelen sayfa yavaş oluşturuluyor;ilk önce profilleyici ile tüm sorgular için toplam kaç saniye harcandığını belirleyin ve en uzun çalışan sorguyu bulmak için sorguları teker teker kontrol edin: getTotalElapsedSecs(); $queryCount = $profiler->getTotalNumQueries(); $longestTime = 0; $longestQuery = null; foreach ($profiler->getQueryProfiles() as $query) { if ($query->getElapsedSecs() > $longestTime) { $longestTime = $query->getElapsedSecs(); $longestQuery = $query->getQuery(); } } echo $totalTime . ' saniye içinde '. $queryCount .' adet sorgu çalıştırıldı' . "\n"; echo 'Ortalama sorgu süresi : ' . $totalTime / $queryCount . ' saniye' . "\n"; echo 'Saniye başı sorgu sayısı: ' . $queryCount / $totalTime . "\n"; echo 'En uzun sorgu süresi: ' . $longestTime . "\n"; echo "En uzun sorgu: \n" . $longestQuery . "\n";]]> İleri Profilleyici Kullanımı Sorgu denetlemeye ek olarak , profilleyici geliştiriciye hangi sorguların profilleneceğini filtrelemeye imkan sağlar. Takip eden metodlar Zend_Db_Profiler isntance'ında çalışır: Sorgu için harcanan süreye göre filtreleme setFilterElapsedSecs() geliştiriciye sorgunun profillenmesi için geçmesi gereken mininimum süreyi belirleme imkanı sağlar. Bu filtreyi kaldırmak için metoda null değer verin. setFilterElapsedSecs(5); // Süresine bakmaksızın tüm sorguları profille: $profiler->setFilterElapsedSecs(null);]]> Sorgu tipine göre filtreleme setFilterQueryType() geliştiriciye hangi tip sorguların profilleneceğini bellirleme imkanı verir; birden çok tip profillemek için mantıksal OR kullanın. Sorgu tipleri takip eden Zend_Db_Profiler sabitleri tarafından tanımlanmıştır: Zend_Db_Profiler::CONNECT: bağlantı işlemleri veya veri tabanı seçimi. Zend_Db_Profiler::QUERY: Diğer tiplere uymayan genel veri tabanı sorguları. Zend_Db_Profiler::INSERT: veri tabanına yeni veri ekleyen herhangi bir sorgu , genellikle INSERT'li SQL. Zend_Db_Profiler::UPDATE: mevcut veriyi güncelleyen herhangi bir sorgu , genellikle UPDATE'li SQL. Zend_Db_Profiler::DELETE: mevcut veriyi silen herhangi bir sorgu , genellikle DELETE'li SQL. Zend_Db_Profiler::SELECT: mevcut veriyi getiren herhangi bir sorgu , genellikle SELECT'li SQL. Zend_Db_Profiler::TRANSACTION: herhangi hareket işlemi start transaction , commit veya rollback gibi. setFilterQueryType ile var olan herhangi filtreyi argüman olarak sadece null vererek kaldırabilirsiniz. setFilterQueryType(Zend_Db_Profiler::SELECT); // SELECT, INSERT, ve UPDATE sorgularını profille $profiler->setFilterQueryType(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE); // DELETE sorgularını profille ( böylece verinin neden kaybolmaya devam ettiğini anlayabilelim) $profiler->setFilterQueryType(Zend_Db_Profiler::DELETE); // Tüml filtreleri kaldır $profiler->setFilterQueryType(null);]]> Sorgu tipine göre profillere erişmek setFilterQueryType() kullanmak oluşturulan profilleri azaltabilir.Buna rağmen bazen tüm profilleri tutmak yararlı olabilir ama bunlara ihtiyacınız olduğu anda bakın. getQueryProfiles() 'ın bir diğer özelliği ise ilk argüman olarak sorgu tipini (veya sorgu tiplerinin mantıksal kombinasyonu) vererek bu filtrelemeyi anında yapabilmesidir ; sorgu tipi sabitleri listesi için bakınız . getQueryProfiles(Zend_Db_Profiler::SELECT); // Sadece SELECT, INSERT, and UPDATE sorgusu profillerine eriş $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT | Zend_Db_Profiler::INSERT | Zend_Db_Profiler::UPDATE); // DELETE sorgularına eriş ( böylece verinin neden kaybolmaya devam ettiğini // anlayabilelim) $profiles = $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);]]>