Проверить настройки Skip to content

Профайлер в Magento

В Magento есть выстроенный «профайлер»(Profiler) который помогает делать отладку php-кода, отладку Magento кода.

Включить «профайлер» можно через админ панель System -> Configuration -> Developer

Вкладка Debug и ставим в значение «yes«.

Теперь можем зайти на сайт и посмотреть, внизу под «футером» будут сообщения «профайлера» Magento, сколько памяти использовано.

Magento профайлер
Magento профайлер

Но при отладке Magento, мало знать сколько памяти использовано :)

Расширим функциональность «профайлера» Magento

Откроем файл index.php, найдем #Varien_Profiler::enable() и роскомментируем (уберем #)

Varien_Profiler::enable()

Снова откроем сайт на Magento, теперь в «профайлере» Magento больше информации. Можно посмотреть сколько времени (в секундах) требуется для обработки скриптов в 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.

Magento профайлер
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 профайлер
Magento профайлер

Функциональность «профайлера» Magento улучшена :)

Обратите внимание, функции getConnection() и getSqlProfiler() в разных версиях Magento могут отличатся. Примеры php-кода для Magento Commerce Community 1.6. Отладку с «профайлером» Magento лучше делать только на «девелоперских» серверах или локально, чтобы избежать не корректной работы «живых» сайтов.

Взято с http://inchoo.net/ecommerce/magento/magento-debugging/extending-default-magento-profiler/

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 1.*
  • Neor

    ну а если у вас любая другая CMS или движок, то могу посоветовать прогу Neor Profile http://www.profilesql.com