В Magento есть выстроенный «профайлер»(Profiler) который помогает делать отладку php-кода, отладку Magento кода.
Включить «профайлер» можно через админ панель System -> Configuration -> Developer
Вкладка Debug и ставим в значение «yes«.
Теперь можем зайти на сайт и посмотреть, внизу под «футером» будут сообщения «профайлера» Magento, сколько памяти использовано.

Но при отладке Magento, мало знать сколько памяти использовано 🙂
Расширим функциональность «профайлера» Magento
Откроем файл index.php, найдем #Varien_Profiler::enable() и роскомментируем (уберем #)
Varien_Profiler::enable()
Снова откроем сайт на Magento, теперь в «профайлере» Magento больше информации. Можно посмотреть сколько времени (в секундах) требуется для обработки скриптов в Magento, теперь есть что анализировать.

Покажем в «профайлере» и SQL-запросы Magento к базе данных
Открываем файл app/code/core/Mage/Core/Model/Resource.php
Находим функцию getConnection(), в коде функции находим приблизительно на 110 строке
$connection = $this->_newConnection((string)$connConfig->type, $connConfig);
И ниже вставим
$connection->getProfiler()->setEnabled(true);
Должно получится где то вот так:
$connection = $this->_newConnection((string)$connConfig->type, $connConfig);
$connection->getProfiler()->setEnabled(true);
Теперь перезагрузим страницу сайта и увидим количество SQL-запросов Magento к базе данных, и сколько времени заняли SQL-запросы Magento.

Покажем SQL-запросы Magento к базе данных
Открываем файл lib/Varien/Profiler.php, находим функцию getSqlProfiler().
Изменим функцию, заменим код на следующий пример
public static function getSqlProfiler($res) {
if(!$res){
return '';
}
$out = '';
$profiler = $res->getProfiler();
if($profiler->getEnabled()) {
$totalTime = $profiler->getTotalElapsedSecs();
$queryCount = $profiler->getTotalNumQueries();
$longestTime = 0;
$longestQuery = null;
$extra = '';
$extra .= '<style type="text/css">
.queryInfoDetails {
border-collapse:collapse;
border-top:solid 3px #E1E6FA;
font-family:"Lucida Sans Unicode","Lucida Grande",Sans-Serif;
font-size:12px;
text-align:left;
width:680px!important;
text-align:left;
margin:30px auto;
}
.queryInfoDetails th {
color:#003399;
font-size:14px;
font-weight:normal;
padding:5px;
border-top:1px solid #E8EDFF;
}
.queryInfoDetails tr:hover, .queryInfoDetails tr:hover td {
background:#EFF2FF none repeat scroll 0 0;
color:#333399;
}
.queryInfoDetails td {
border-top:1px solid #E8EDFF;
color:#666699;
padding:5px;
}
</style>';
$counter = 0;
foreach ($profiler->getQueryProfiles() as $query) {
$queryParams = $query->getQueryParams();
$params = 'none';
if(!empty($queryParams)) { $params = print_r($queryParams,1); }
$queryType = (int)$query->getQueryType();
switch ($queryType) {
case 1:
$queryType = 'CONNECT';
break;
case 2:
$queryType = 'QUERY';
break;
case 4:
$queryType = 'INSERT';
break;
case 8:
$queryType = 'UPDATE';
break;
case 16:
$queryType = 'DELETE';
break;
case 32:
$queryType = 'SELECT';
break;
case 64:
$queryType = 'TRANSACTION';
break;
}
$extra .= '<table class="queryInfoDetails" cellpadding="0" cellspacing="0">
<tr><th>Query no.</th><td>'.++$counter.'</td></tr>
<tr><th>Query type</th><td>'.$queryType.'</td></tr>
<tr><th>Query params</th><td>'.$params.'</td></tr>
<tr><th>Elapsed seconds</th><td>'.$query->getElapsedSecs().'</td></tr>
<tr><th>Raw query</th><td>'.wordwrap($query->getQuery()).'</td></tr>
</table>';
if ($query->getElapsedSecs() > $longestTime) {
$longestTime = $query->getElapsedSecs();
$longestQuery = $query->getQuery();
}
}
$out .= 'Executed ' . $queryCount . ' queries in ' . $totalTime . ' seconds' . "<br>";
$out .= 'Average query length: ' . $totalTime / $queryCount . ' seconds' . "<br>";
$out .= 'Queries per second: ' . $queryCount / $totalTime . "<br>";
$out .= 'Longest query length: ' . $longestTime . "<br>";
$out .= 'Longest query: <br>' . $longestQuery . "<hr>";
}
$out .= $extra;
return $out;
}
Теперь в «профайлере» Magento будут показываться все SQL-запросов Magento к базе данных которые делает Magento при создании страницы.

Функциональность «профайлера» Magento улучшена 🙂
Обратите внимание, функции getConnection() и getSqlProfiler() в разных версиях Magento могут отличатся. Примеры php-кода для Magento Commerce Community 1.6. Отладку с «профайлером» Magento лучше делать только на «девелоперских» серверах или локально, чтобы избежать не корректной работы «живых» сайтов.
Взято с
if(!$res){
return »;
}
$out = »;
$profiler = $res->getProfiler();
if($profiler->getEnabled()) {
$totalTime = $profiler->getTotalElapsedSecs();
$queryCount = $profiler->getTotalNumQueries();
$longestTime = 0;
$longestQuery = null;
$extra = »;
$extra .= ‘<style type=»text/css»>
.queryInfoDetails {
border-collapse:collapse;
border-top:solid 3px #E1E6FA;
font-family:»Lucida Sans Unicode»,»Lucida Grande»,Sans-Serif;
font-size:12px;
text-align:left;
width:680px!important;
text-align:left;
margin:30px auto;
}
.queryInfoDetails th {
color:#003399;
font-size:14px;
font-weight:normal;
padding:5px;
border-top:1px solid #E8EDFF;
}
.queryInfoDetails tr:hover, .queryInfoDetails tr:hover td {
background:#EFF2FF none repeat scroll 0 0;
color:#333399;
}
.queryInfoDetails td {
border-top:1px solid #E8EDFF;
color:#666699;
padding:5px;
}
</style>’;
$counter = 0;
foreach ($profiler->getQueryProfiles() as $query) {
$queryParams = $query->getQueryParams();
$params = ‘none’;
if(!empty($queryParams)) { $params = print_r($queryParams,1); }
$queryType = (int)$query->getQueryType();
switch ($queryType) {
case 1:
$queryType = ‘CONNECT’;
break;
case 2:
$queryType = ‘QUERY’;
break;
case 4:
$queryType = ‘INSERT’;
break;
case 8:
$queryType = ‘UPDATE’;
break;
case 16:
$queryType = ‘DELETE’;
break;
case 32:
$queryType = ‘SELECT’;
break;
case 64:
$queryType = ‘TRANSACTION’;
break;
}
$extra .= ‘<table class=»queryInfoDetails» cellpadding=»0″ cellspacing=»0″>
<tr><th>Query no.</th><td>’.++$counter.'</td></tr>
<tr><th>Query type</th><td>’.$queryType.'</td></tr>
<tr><th>Query params</th><td>’.$params.'</td></tr>
<tr><th>Elapsed seconds</th><td>’.$query->getElapsedSecs().'</td></tr>
<tr><th>Raw query</th><td>’.wordwrap($query->getQuery()).'</td></tr>
</table>’;
if ($query->getElapsedSecs() > $longestTime) {
$longestTime = $query->getElapsedSecs();
$longestQuery = $query->getQuery();
}
}
$out .= ‘Executed ‘ . $queryCount . ‘ queries in ‘ . $totalTime . ‘ seconds’ . «<br>»;
$out .= ‘Average query length: ‘ . $totalTime / $queryCount . ‘ seconds’ . «<br>»;
$out .= ‘Queries per second: ‘ . $queryCount / $totalTime . «<br>»;
$out .= ‘Longest query length: ‘ . $longestTime . «<br>»;
$out .= ‘Longest query: <br>’ . $longestQuery . «<hr>»;
}
$out .= $extra;
return $out;
}