• Блог
  • Системные теги MODX

Многие разработчики знают, что в 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   2055     0

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

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

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