Низкая производительность "виртуальных" страниц

Создаю свою систему ЧПУ (читаемых URL'ов) на ModX. Реализуется она плагином на событии OnPageNotFound:

if ($modx->event->name != 'OnPageNotFound') {return false;}

$alias = $modx->context->getOption('request_param_alias', 'q');

$object_id = URLParser($_REQUEST[$alias]);
$modx->setPlaceholder('ObjectID', $object_id);
$modx->sendForward(1342);
Дальше внутри страницы на основании этого плейсхолдера выводится содержание объекта. Подобный подход связан с тем, что объекты находятся и администрируются в другой базе. Тащить их в ModX — слишком затратно.

Заметил, что производительность подобных виртуальных страниц сильно хромает. При запросе к ней тратится где-то на 0,1-0,2 сек больше, чем если бы страница была реальной (т.е. имела бы свой фиксированный, понятный ModX URL).

Эксперименты показали, что проблема в Wayfinder. На подобных «виртуальных» страницах он формирует меню из 8 пунктов на 0,1-0,15 сек дольше. При этом в кэше страницы он появляется, но время его повторных вызовов от этого особо не уменьшается.

Хочется исправить этот косяк, т.к. другие страницы с той же структурой выполняются гораздо быстрее.

У кого-нибудь есть идеи, в чем может быть загвоздка? Или может быть предложите другую реализацию «виртуальных» страниц?
Константин
27 января 2015, 14:52
modx.pro
1 271
0

Комментарии: 6

Василий Наумкин
27 января 2015, 18:17
0
Работа с OnPageNotFound по определению чуть медленнее, потому что сайту сначала нужно понять, что запрошенной страницы нет, потом выдать событие, а потом снова искать нужную страницу, но уже через твой плагин.

Правда, обычно речь не идёт 0,1-0,15 сек. Например, у нас здесь весь раздел пользователей работает на OnPageNotFound и, вроде, не тормозят.

Попробуй заменить Wayfinder на pdoMenu.
    nekto
    31 января 2016, 21:34
    0
    Пробую реализовать страницы через кастомную таблицу, использую событие OnPageNotFound. Если открывать несколько страниц, то кешируется первая страница и почему-то показывается на всех последующих. Не скажите, почему так происходит?
Иван Брежнев
27 января 2015, 20:04
0
Можно попробовать повесить плагин на событие OnHandleRequest, но придется изменить немного логику плагина
    Воеводский Михаил
    31 января 2016, 22:50
    0
    Еще вариант — на событии OnMODXInit проверять $_REQUEST['q'] на соответствие собственному шаблону и, если подходит, часть uri отправлять в качестве get параметра, в q оставив только адрес существующего ресурса.

    Возможно, костыльное решение, однако в некоторых случаях может быть весьма оправданным.
      Воеводский Михаил
      31 января 2016, 23:02
      0
      Плюс: нет события OnPageNotFound и связанных с ним замедляющих механизмов.
      Минус: зашитая в коде маршрутизация. Подходит только для малого количества очень редко меняющихся шаблонов.
      Сильный минус: нестандартный подход, усложняющий понимание иными разработчиками.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      6