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);
ÁÁ¾ÆÇÏ´Â °÷¿¡¼ ¾î´ðÅÍÀÇ
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";
´ÜÁö Äõ¸®¸¦ Á¶»çÇÒ »Ó¸¸ ¾Æ´Ï¶ó, ¾î´À Äõ¸®¸¦ Á¶»çÇϴ°¡ ÇÑ´Ù
Á¶°ÇÀ» ÁöÁ¤ÇÏ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù.ÀÌÇÏ·Î ¼³¸íÇÏ´Â ¸Þ¼Òµå´Â,
Zend_Db_Profiler
ÀνºÅϽºÀÇ ¸Þ¼ÒµåÀÔ´Ï´Ù.
setFilterElapsedSecs()
(Àº)´Â, Äõ¸®ÀÇ Á¤º¸¸¦ ÃëµæÇÏ´Â Á¶°ÇÀ¸·Î¼
½ÇÇà ¼Ò¿ä ½Ã°£ÀÇ ÃÖ¼ÒÄ¡¸¦ ÁöÁ¤ÇÕ´Ï´Ù.ÀÌ ÇÊÅ͸¦ »èÁ¦ÇÏ·Á¸é ,
¸Þ¼Òµå¿¡ null °ªÀ» °Ç³×ÁÝ´Ï´Ù.
<?php
// ¼Ò¿ä ½Ã°£ÀÌ 5 ÃÊÀÌ»óÀÇ Äõ¸®¸¸ Á¶»çÇÕ´Ï´Ù
$profiler->setFilterElapsedSecs(5);
// ¼Ò¿ä ½Ã°£¿¡ °ü°è¾øÀÌ, ¸ðµç Äõ¸®¸¦ Á¶»çÇÕ´Ï´Ù
$profiler->setFilterElapsedSecs(null);
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);
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);