Многие разработчики знают, что в MODX есть специальные теги, которые показывают важную информацию — время загрузки страницы, количество запросов к базе данных, откуда взята страница — из кэша или из БД. Давайте посмотрим на них.

  • [^q^] — количество запросов к БД.
  • [^qt^] — время, затраченное на обработку запросов.
  • [^p^] — время работы php скрипта.
  • [^t^] — общее время загрузки страницы. Сумма двух предыдущих значений.
  • [^s^] — источник загрузки страницы — кэш или база данных.

Но не все разработчики знают (именно разработчики!), что за достоверность информации первых двух тегов они несут прямую ответственность. Почему? Да потому, что MODX не всегда отслеживает обращения к БД. Например, при использовании методов xPDO::getObject(), xPDO::getCollection(), xPDO::query() или xPDO::exec() MODX зафиксирует обращение к БД и обновит статистику запросов. А вот если не пользоваться готовыми методами, а формировать запросы самостоятельно, используя методы xPDO::prepare() и xPDO::execute(), то можно заметить, что количество запросов не изменилось. Давайте попробуем разобраться.

Данные о запросах MODX хранит в свойствах объекта $modx:

  • $modx->executedQueries — количество запросов к БД.
  • $modx->queryTime — общее время запросов к БД.

Теперь давайте посмотрим на метод xPDO::query().

public function exec($query) {
    if (!$this->connect(null, array(xPDO::OPT_CONN_MUTABLE => true))) {
        return false;
    }
    $tstart= microtime(true);
    $return= $this->pdo->exec($query);
    $this->queryTime += microtime(true) - $tstart; // Прибавляется время текущего запроса к общему времени запросов.
    $this->executedQueries++;  // Увеличивается счётчик запросов.
    return $return;
}

Из него видно, как MODX формирует информацию о запросах. А вот такой код на статистику запросов не повлияет:

$sql = 'SELECT * FROM ' . $modx->getTableName('modResource');
$stmt = $modx->prepare($sql);
$stmt->execute();

Тут уже разработчик должен сам обновить системные данные о запросах. Например, я часто пользуюсь вот такой конструкцией:

$q = $modx->newQuery('modResource');
$q->where(array('published' => 1, 'deleted' => 0));
$q->select($modx->getSelectColumns('modResource'));
$tstart = microtime(true);
if ($q->prepare() && $q->stmt->execute()) {
    $modx->queryTime += microtime(true) - $tstart;
    $modx->executedQueries++;
    $rows = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
}

Теперь информация о запросах будет достоверной.

Обратите внимание, у меня на сайте ещё выводится информация о потреблённой памяти. У MODX нет стандартного тега для этого. Но в версии 2.6.0 должен появится. У него будет такой формат — [^m^]. А пока я самостоятельно это вычисляю.

// Строчка из чанка Footer
memory: {var $memory = $.php.memory_get_usage(true)/ 1024} {$.php.number_format($memory, 0,","," ")} Kb

Как видно, я использую феном из pdoTools в режиме php. Но можно сделать это и через обычный сниппет:

<?php
return number_format(memory_get_usage(true), 0,","," ") . ' Kb';

Вызывать этот сниппет нужно некэшированным.

Надеюсь, данная информация пригодится вам для отладки и оптимизации сайта.

27 апреля 2016, 19:46   1609     0

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.