10.3. Zend_Db_Profiler

10.3.1. µµÀÔ

Zend_Db_Profiler (À»)¸¦ »ç¿ëÇϸé, Äõ¸®ÀÇ Á¤º¸¸¦ ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù. ¾î´ðÅͰ¡ ½ÇÁ¦·Î ½ÇÇàÇÑ Äõ¸®ÀÇ ³»¿ëÀ̳ª ½ÇÇà ¼Ò¿ä ½Ã°£µîÀ» ÃëµæÇÒ ¼ö ÀÖ¾î ºÒÇÊ¿äÇÑ µð¹ö±× Äڵ带 Ŭ·¡½º¿¡ Ãß°¡ÇÏÁö ¾Ê¾Æµµ Äõ¸®¸¦ Á¶»çÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù. °Ô´Ù°¡ Á¶°ÇÀ» ÁöÁ¤ÇØ Æ¯Á¤ÀÇ Äõ¸®¸¸ÀÇ Á¤º¸¸¦ ÃëµæÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

ÇÁ·Î filer¸¦ À¯È¿ÇÏ°Ô ÇÏ·Á¸é , ¾î´ðÅÍÀÇ constructor¡¡ ¡¡ À¸·Î ÁöÁ¤ÇÏ´ÂÁö, ȤÀº ³ªÁß¿¡ ¾î´ðÅÍ¿¡ Áö½ÃÇÕ´Ï´Ù.


<?php
require_once 'Zend/Db.php';

$params = array(
    
'host'     => '127.0.0.1',
    
'username' => 'webuser',
    
'password' => 'xxxxxxxx',
    
'dbname'   => 'test'
    'profiler' 
=> true  // ÇÁ·Î filer¸¦ »ç¿ëÇÕ´Ï´Ù.false (µðÆúÆ®) (À¸)·Î ÇÏ¸é ¹«È¿°¡ µË´Ï´Ù.
);

$db Zend_Db::factory('PDO_MYSQL'$params);

// ÇÁ·Î filer¸¦ ¹«È¿·Î ÇÕ´Ï´Ù
$db->getProfiler()->setEnabled(false);

// ÇÁ·Î filer¸¦ À¯È¿ÇÏ°Ô ÇÕ´Ï´Ù
$db->getProfiler()->setEnabled(true);

profiler ¿É¼ÇÀÇ °ª¿¡´Â À¯¿¬¼ºÀÌ ÀÖ¾î, ±× ÇüÅ¿¡ µû¸£°í, ´Ù¾çÇÑ Çü½Ä¿¡¼­ ÇØ¼®µË´Ï´Ù. ´ëºÎºÐÀº ´Ü¼øÇÑ boolean °ªÀ» ÁöÁ¤ÇÏ°Ô µÇ°ÚÁö¸¸, ±× ¿ÜÀÇ ÇüŸ¦ ÁöÁ¤ÇÏ´Â °ÍÀ¸·Î ÇÁ·Î filerÀÇ ÇൿÀ» Ä¿½ºÅ͸¶ÀÌÁî ÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù.

boolean Àμö true (À»)¸¦ ÁöÁ¤Çϸé, ÇÁ·Î filer¸¦ À¯È¿ÇÏ°Ô ÇÕ´Ï´Ù.ȤÀº false (À¸)·Î Çϸé, ÇÁ·Î filer¸¦ ¹«È¿·Î ÇÕ´Ï´Ù.ÇÁ·Î filerÀÇ Å¬·¡½º´Â, ±× ¾î´ðÅÍÀÇ µðÆúÆ®ÀÇ ÇÁ·Î filer Ŭ·¡½ºÀÌ´Ù Zend_Db_Profiler µË´Ï´Ù.


$params['profiler'] = true;
$db = Zend_Db::factory('PDO_MYSQL', $params);

ÇÁ·Î filer ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº¸¦, ¾î´ðÅÍ·Î »ç¿ëÇÕ´Ï´Ù. ÀÌ ¿ÀºêÁ§Æ®ÀÇ ÇüÅ´Â,Zend_Db_Profiler ȤÀº ±× ¼­ºê Ŭ·¡½º°¡ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù. ÇÁ·Î filer¸¦ À¯È¿ÇÏ°Ô ÇÏ·Á¸é , ´ÙÀ½¿¡ °°°Ô ÇÕ´Ï´Ù.


$profiler = MyProject_Db_Profiler();
$profiler->setEnabled(true);
$params['profiler'] = $profiler;
$db = Zend_Db::factory('PDO_MYSQL', $params);

Àμö´Â ¿¬»ó ¹è¿­·Î,'enabled', 'instance' ¹× 'class' ÀÇ ¾ðÁ¨°¡ (ȤÀº ¸ðµÎ) ÀÇ Å°¸¦ °¡Áý´Ï´Ù. 'enabled' (¿Í)°ú 'instance' (Àº)´Â, °¢°¢ boolean ¹× À§¿¡¼­ ¼³¸íÇÑ ÀνºÅϽºÀÔ´Ï´Ù. 'class' (Àº)´Â, µ¶ÀÚÀûÀÎ ÇÁ·Î filer¸¦ »ç¿ëÇÏ´Â °æ¿ìÀÇ Å¬·¡½º¸íÀ» ÁöÁ¤ÇÕ´Ï´Ù. ÀÌ Å¬·¡½º´Â Zend_Db_Profiler ȤÀº ±× ¼­ºê Ŭ·¡½º°¡ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù. ÀÌ Å¬·¡½º´Â, constructor¡¡ ¡¡ ¿¡ ¾Æ¹«°Íµµ Àμö¸¦ °Ç³×ÁÖÁö ¸»°í ÀνºÅϽºÈ­ µË´Ï´Ù. 'class' ÀÇ ³»¿ëÀº, 'instance' (À»)¸¦ ÁöÁ¤ÇßÀ» ¶§¿¡´Â ¹«½ÃµË´Ï´Ù.


$params['profiler'] = array(
    'enabled' => true,
    'class'   => 'MyProject_Db_Profiler'
);
$db = Zend_Db::factory('PDO_MYSQL', $params);

¶Ç, Àμö´Â Zend_Config ÀÇ ¿ÀºêÁ§Æ®·Î °Ç³×ÁÙ ¼öµµ ÀÖ½À´Ï´Ù. ÀÌ ¿ÀºêÁ§Æ®ÀÇ ÇÁ·ÓÆÛƼ°¡, ¹æ±ÝÀüÀÇ ¿¬»ó ¹è¿­ÀÇ Å°¿Í °°ÀÌ ÇØ¼®µË´Ï´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½°ú °°Àº ³»¿ëÀÇ "config.ini" ÆÄÀÏÀÌ ÀÖ¾ú´Ù°í ÇսôÙ.


[main]
db.profiler.class   = "MyProject_Db_Profiler"
db.profiler.enabled = true

ÀÌ ¼³Á¤À» Àû¿ëÇÏ·Á¸é , ´ÙÀ½°ú °°Àº PHP Äڵ带 ¾¹´Ï´Ù.


$config = new Zend_Config_Ini('config.ini', 'main');
$params['profiler'] = $config->db->profiler;
$db = Zend_Db::factory('PDO_MYSQL', $params);

'instance' ÇÁ·ÓÆÛƼ´Â, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÕ´Ï´Ù.


$profiler = new MyProject_Db_Profiler();
$profiler->setEnabled(true);
$configData = array(
    'instance' => $profiler
    );
$config = new Zend_Config($configData);
$params['profiler'] = $config;
$db = Zend_Db::factory('PDO_MYSQL', $params);

10.3.2. ÇÁ·Î filerÀÇ »ç¿ë

ÁÁ¾ÆÇÏ´Â °÷¿¡¼­ ¾î´ðÅÍÀÇ getProfiler() ¸Þ¼Òµå¸¦ »ç¿ëÇϸé, ÇÁ·Î filer¸¦ ÃëµæÇÒ ¼ö ÀÖ½À´Ï´Ù.


<?php
$profiler 
$db->getProfiler();

À̰ÍÀº,Zend_Db_Profiler ¿ÀºêÁ§Æ®ÀÇ ÀνºÅϽº¸¦ µ¹·ÁÁÝ´Ï´Ù. ÀÌ ÀνºÅϽºÀÇ ´Ù¾çÇÑ ¸Þ¼Òµå¸¦ »ç¿ëÇÏ´Â °ÍÀ¸·Î, Äõ¸®ÀÇ ³»¿ëÀ» Á¶»çÇÒ ¼ö ÀÖ½À´Ï´Ù.

  • getTotalNumQueries() (Àº)´Â, Á¤º¸¸¦ ÃëµæÇÑ Äõ¸®ÀÇ ÃѼö¸¦ µ¹·ÁÁÝ´Ï´Ù.

  • getTotalElapsedSecs() (Àº)´Â, Á¤º¸¸¦ ÃëµæÇÑ Äõ¸®ÀÇ ½ÇÇà ¼Ò¿ä ½Ã°£ÀÇ Çհ踦 µ¹·ÁÁÝ´Ï´Ù.

  • getQueryProfiles() (Àº)´Â, ¸ðµç Äõ¸® Á¤º¸¸¦ ¹è¿­·Î µ¹·ÁÁÝ´Ï´Ù.

  • getLastQueryProfile() (Àº)´Â, ¸¶Áö¸·¿¡ (¹Ù·Î ¿·¿¡) ½ÇÇàµÈ Äõ¸®ÀÇ Á¤º¸¸¦ (±× Äõ¸®°¡ ¿Ï·áÇÑÁö ¾Æ´ÑÁö¿¡ °ü°è¾øÀÌ) µ¹·ÁÁÝ´Ï´Ù (Äõ¸®°¡ ¿Ï·áÇϰí ÀÖÁö ¾Ê´Â °æ¿ì´Â, Á¾·á½Ã°¢ÀÌ null µË´Ï´Ù).

  • clear() (Àº)´Â, ½ºÅÃ»ó¿¡ ³²¾Æ ÀÖ´Ù °ú°ÅÀÇ Äõ¸® Á¤º¸¸¦ ¸ðµÎ ¼Ò°ÅÇÕ´Ï´Ù.

getLastQueryProfile() ÀÇ µ¹¾Æ°¡ °ª, ¹× getQueryProfiles() ÀÇ °³°³ÀÇ ¿ä¼Ò´Â Zend_Db_Profiler_Query ¿ÀºêÁ§Æ®·Î, À̰ÍÀ» »ç¿ëÇÏ¸é °³°³ÀÇ Äõ¸® ÀÚüÀÇ Á¤º¸¸¦ Á¶»çÇÒ ¼ö ÀÖ½À´Ï´Ù.

  • getQuery() (Àº)´Â, Äõ¸®ÀÇ SQL ÅØ½ºÆ®¸¦ µ¹·ÁÁÝ´Ï´Ù. ÆÄ¶ó¹ÌÅÍÆ÷ÇÔÀÇ ÇÁ¸®Æä¾Æµå½ºÅ×ÀÌÆ®¸ÕÆ®ÀÇ °æ¿ì, Äõ¸®°¡ ÇÁ¸®Æä¾Æ µÈ ½ÃÁ¡ÀÇ ÅØ½ºÆ®¸¦ µ¹·ÁÁÝ´Ï´Ù. Áï, Ç÷¹À̽ºÈ¦´õ¸¦ Æ÷ÇÔÇÑ Ã¤·ÎÀÇ Çü½ÄÀ̶ó°í ÇÏ´Â °ÍÀÔ´Ï´Ù. ½ÇÇà½Ã·Î ¿Å°ÜÁø °ªÀ» ¾Ë ¼ö ¾ø½À´Ï´Ù.

  • getQueryParams() (Àº)´Â, ÇÁ¸®Æä¾ÆµåÅ©¿¡¸®¸¦ ½ÇÇàÇÒ ¶§¿¡ »ç¿ëÇÏ´Â, ÆÄ¶ó¹ÌÅÍÀÇ °ªÀÇ ¹è¿­À» µ¹·ÁÁÝ´Ï´Ù. ¿©±â¿¡´Â, ¹ÙÀεåÆÄ¶ó¸ÞÀÌŸ »Ó¸¸ÀÌ ¾Æ´Ï¶ó execute() ¸Þ¼Òµå¿¡ÀÇ Àμöµµ Æ÷ÇԵ˴ϴÙ. ¹è¿­ÀÇ Å°´Â,(1 (À¸)·ÎºÎÅÍ ½ÃÀ۵ȴÙ) ¼öÄ¡³ª ȤÀº (¹®ÀÚ¿­ÀÇ) ÆÄ¶ó¹ÌÅ͸íÀÌ µË´Ï´Ù.

  • getElapsedSecs() (Àº)´Â, Äõ¸®ÀÇ ½ÇÇà ¼Ò¿ä ½Ã°£À» µ¹·ÁÁÝ´Ï´Ù.

Zend_Db_Profiler ÀÇ Á¦°øÇÏ´Â Á¤º¸´Â, ¾îÇø®ÄÉÀ̼ÇÀÇ º¸Æ² ³ØÀ» Á¶»çÇϰųª Äõ¸®¸¦ µð¹ö±× Çϰųª ÇÏ´Â °æ¿ì¿¡ À¯¿ëÇÕ´Ï´Ù. ¿¹¸¦ µé¸é, ¹Ù·Î ¿·¿¡ ½ÇÇàµÈ Äõ¸®°¡ ½ÇÁ¦ÀÇ °÷ ¾î¶² °ÍÀ̾ú´Â°¡¸¦ ¾Ë·Á¸é ´ÙÀ½°ú °°ÀÌ ÇÕ´Ï´Ù.


<?php
$query 
$profiler->getLastQueryProfile();

echo 
$query->getQuery();

ÆäÀÌÁöÀÇ »ý¼º¿¡ ½Ã°£ÀÌ °É·Á ÀÖ´Ù°í ÇսôÙ.ÀÌ °æ¿ì, ÇÁ·Î filer¸¦ »ç¿ëÇØ ¿ì¼± ÀüÄõ¸®ÀÇ ½ÇÇà ¼Ò¿äÃʼö¸¦ ÃëµæÇÕ´Ï´Ù. ±×¸®°í, °³°³ÀÇ Äõ¸®¸¦ Á¶»çÇØ Á¦ÀÏ ½Ã°£ÀÌ °É·Á ÀÖ´Â °ÍÀº ¾î¶² °ÍÀÎÁö¸¦ ã¾Æ³À´Ï´Ù.


<?php
$totalTime    
$profiler->getTotalElapsedSecs();
$queryCount   $profiler->getTotalNumQueries();
$longestTime  0;
$longestQuery null;

foreach (
$profiler->getQueryProfiles() as $query) {
    if (
$query->getElapsedSecs() > $longestTime) {
        
$longestTime  $query->getElapsedSecs();
        
$longestQuery $query->getQuery();
    }
}

echo 
'ÀüºÎ ' $queryCount ' °ÇÀÇ Äõ¸®°¡ ' $totalTime ' ÃÊ¿¡ ½ÇÇàµÇ¾ú½À´Ï´Ù' "n";
echo 
'Æò±ÕÀÇ ¼Ò¿ä ½Ã°£: ' $totalTime $queryCount ' ÃÊ' "n";
echo 
'1 ÃÊÂëÀÇ Äõ¸® ½ÇÇà¼ö: ' $queryCount $totalTime "n";
echo 
'¼Ò¿ä ½Ã°£ÀÇ ÃÖ´ëÄ¡: ' $longestTime "n";
echo 
"Á¦ÀÏ ½Ã°£ÀÌ °É¸®°í ÀÖ´Â Äõ¸®: n" $longestQuery "n";

10.3.3. ÇÁ·Î filerÀÇ °íµµÀÇ »ç¿ë¹ý

´ÜÁö Äõ¸®¸¦ Á¶»çÇÒ »Ó¸¸ ¾Æ´Ï¶ó, ¾î´À Äõ¸®¸¦ Á¶»çÇϴ°¡ ÇÑ´Ù Á¶°ÇÀ» ÁöÁ¤ÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù.ÀÌÇÏ·Î ¼³¸íÇÏ´Â ¸Þ¼Òµå´Â, Zend_Db_Profiler ÀνºÅϽºÀÇ ¸Þ¼ÒµåÀÔ´Ï´Ù.

10.3.3.1. Äõ¸®ÀÇ ½ÇÇà ¼Ò¿ä ½Ã°£¿¡ ÀÇÇÑ ÃßÃâ

setFilterElapsedSecs() (Àº)´Â, Äõ¸®ÀÇ Á¤º¸¸¦ ÃëµæÇÏ´Â Á¶°ÇÀ¸·Î¼­ ½ÇÇà ¼Ò¿ä ½Ã°£ÀÇ ÃÖ¼ÒÄ¡¸¦ ÁöÁ¤ÇÕ´Ï´Ù.ÀÌ ÇÊÅ͸¦ »èÁ¦ÇÏ·Á¸é , ¸Þ¼Òµå¿¡ null °ªÀ» °Ç³×ÁÝ´Ï´Ù.


<?php
// ¼Ò¿ä ½Ã°£ÀÌ 5 ÃÊÀÌ»óÀÇ Äõ¸®¸¸ Á¶»çÇÕ´Ï´Ù
$profiler->setFilterElapsedSecs(5);

// ¼Ò¿ä ½Ã°£¿¡ °ü°è¾øÀÌ, ¸ðµç Äõ¸®¸¦ Á¶»çÇÕ´Ï´Ù
$profiler->setFilterElapsedSecs(null);

10.3.3.2. Äõ¸®ÀÇ Çü½Ä¿¡ ÀÇÇÑ ÃßÃâ

setFilterQueryType() (Àº)´Â, Äõ¸®ÀÇ Á¤º¸¸¦ ÃëµæÇÏ´Â Á¶°ÇÀ¸·Î¼­ Äõ¸®ÀÇ Çü½ÄÀ» ÁöÁ¤ÇÕ´Ï´Ù.º¹¼öÀÇ Çü½ÄÀ» Ãë±ÞÇÏ·Á¸é , ±×·¯ÇÑ ³í¸® OR (À»)¸¦ ÁöÁ¤ÇÕ´Ï´Ù. Äõ¸®ÀÇ Çü½ÄÀº,Zend_Db_Profiler ÀÇ Å¬·¡½º Á¤¼ö·Î¼­ ÀÌÇÏ¿Í °°ÀÌ Á¤Àǵǰí ÀÖ½À´Ï´Ù.

  • Zend_Db_Profiler::CONNECT: Á¢¼Ó Á¶ÀÛ, ȤÀº µ¥ÀÌŸº£À̽ºÀÇ ¼±ÅÃ.

  • Zend_Db_Profiler::QUERY: ´Ù¸¥ Çü½Ä¿¡ µé¾î¸ÂÁö ¾Ê´Â Äõ¸®.

  • Zend_Db_Profiler::INSERT: »õ·Î¿î µ¥ÀÌÅ͸¦ µ¥ÀÌŸº£À̽º¿¡ Ãß°¡ÇÏ´Â Äõ¸®. ÀϹÝÀûÀ¸·Î´Â SQL ÀÇ INSERT.

  • Zend_Db_Profiler::UPDATE: ±âÁ¸ÀÇ µ¥ÀÌÅ͸¦ °»½ÅÇÏ´Â Äõ¸®.Åë»óÀº SQL ÀÇ UPDATE.

  • Zend_Db_Profiler::DELETE: ±âÁ¸ÀÇ µ¥ÀÌÅ͸¦ »èÁ¦ÇÏ´Â Äõ¸®.Åë»óÀº SQL ÀÇ DELETE.

  • Zend_Db_Profiler::SELECT: ±âÁ¸ÀÇ µ¥ÀÌÅ͸¦ ÃëµæÇÏ´Â Äõ¸®.Åë»óÀº SQL ÀÇ SELECT.

  • Zend_Db_Profiler::TRANSACTION: Æ®·£Àè¼Ç(transaction)¿¡ °üÇÑ Á¶ÀÛ.¿¹¸¦ µé¸é Æ®·£Àè¼Ç(transaction)ÀÇ °³½Ã³ª À§Å¹, ·Ñ¹é(rollback) µî.

±âÁ¸ÀÇ ÇÊÅ͸¦ »èÁ¦ÇÏ·Á¸é , setFilterElapsedSecs() ÀÇ Àμö¿¡ null ¸¸À» °Ç³×ÁÝ´Ï´Ù.


<?php
// SELECT Äõ¸®¸¸À» Á¶»çÇÕ´Ï´Ù
$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT);

// SELECT,INSERT ±×¸®°í UPDATE Äõ¸®¸¦ Á¶»çÇÕ´Ï´Ù
$profiler->setFilterQueryType(Zend_Db_Profiler::SELECT Zend_Db_Profiler::INSERT Zend_Db_Profiler::UPDATE);

// DELETE Äõ¸®¸¦ Á¶»çÇÕ´Ï´Ù (»èÁ¦µÈ µ¥ÀÌÅ͸¦ ã¾Æ³¾ ¼ö ÀÖ½À´Ï´Ù)
$profiler->setFilterQueryType(Zend_Db_Profiler::DELETE);

// ¸ðµç ÇÊÅ͸¦ »èÁ¦ÇÕ´Ï´Ù
$profiler->setFilterQueryType(null);

10.3.3.3. Äõ¸®ÀÇ ÇüŸ¦ ÁöÁ¤ÇÏ´Â °Í¿¡ ÀÇÇÑ Á¤º¸ÀÇ Ãëµæ

setFilterQueryType() (À»)¸¦ »ç¿ëÇϸé, »ý¼ºµÇ´Â Á¤º¸¸¦ ÁÙÀÏ ¼ö ÀÖ½À´Ï´Ù. ¸ðµç Á¤º¸¸¦ º¸°ü À¯ÁöÇØ µÎ´Â ÆíÀÌ ÁÁÀº °æ¿ìµµ ÀÖ½À´Ï´Ù¸¸, º¸ÅëÀº ±× ¶§¿¡ ÇÊ¿äÇÑ Á¤º¸¸¸À» º¼ ¼ö ÀÖÀ¸¸é ÁÁÀ» °ÍÀÔ´Ï´Ù. getQueryProfiles() ¸¶½ÃÀÚ ÇϳªÀÇ ±â´ÉÀ¸·Î¼­ ÃÖÃÊÀÇ Àμö¿¡ Äõ¸®ÀÇ ÇüÅ (ȤÀº º¹¼öÀÇ ÇüÅÂÀÇ ³í¸®ÇÕ) (À»)¸¦ ÁöÁ¤ÇÏ´Â °Í¿¡ ÀÇÇÑ ±× ÀÚ¸®·ÎÀÇ ÃßÃâÀÌ °¡´ÉÇÕ´Ï´Ù. Äõ¸®ÀÇ ÇüŸ¦ ³ªÅ¸³»´Â Á¤¼ö¿¡ ´ëÇØ¼­´Â Ç×10.3.3.2. ¡¸Äõ¸®ÀÇ Çü½Ä¿¡ ÀÇÇÑ ÃßÃ⡹ (À»)¸¦ ÂüÁ¶ÇØ ÁֽʽÿÀ.


<?php
// SELECT Äõ¸®ÀÇ Á¤º¸¸¸À» ÃëµæÇÕ´Ï´Ù
$profiles $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT);

// SELECT,INSERT ±×¸®°í UPDATE Äõ¸®ÀÇ Á¤º¸¸¸À» ÃëµæÇÕ´Ï´Ù
$profiles $profiler->getQueryProfiles(Zend_Db_Profiler::SELECT Zend_Db_Profiler::INSERT Zend_Db_Profiler::UPDATE);

// DELETE Äõ¸®ÀÇ Á¤º¸¸¦ ÃëµæÇÕ´Ï´Ù (µ¥ÀÌÅͰ¡ ¿Ö »èÁ¦µÇ¾ú´ÂÁö¸¦
// ¾Ë ¼ö ÀÖ½À´Ï´Ù)
$profiles $profiler->getQueryProfiles(Zend_Db_Profiler::DELETE);