Низкая производительность "виртуальных" страниц
Создаю свою систему ЧПУ (читаемых URL'ов) на ModX. Реализуется она плагином на событии OnPageNotFound:
Заметил, что производительность подобных виртуальных страниц сильно хромает. При запросе к ней тратится где-то на 0,1-0,2 сек больше, чем если бы страница была реальной (т.е. имела бы свой фиксированный, понятный ModX URL).
Эксперименты показали, что проблема в Wayfinder. На подобных «виртуальных» страницах он формирует меню из 8 пунктов на 0,1-0,15 сек дольше. При этом в кэше страницы он появляется, но время его повторных вызовов от этого особо не уменьшается.
Хочется исправить этот косяк, т.к. другие страницы с той же структурой выполняются гораздо быстрее.
У кого-нибудь есть идеи, в чем может быть загвоздка? Или может быть предложите другую реализацию «виртуальных» страниц?
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 сек дольше. При этом в кэше страницы он появляется, но время его повторных вызовов от этого особо не уменьшается.
Хочется исправить этот косяк, т.к. другие страницы с той же структурой выполняются гораздо быстрее.
У кого-нибудь есть идеи, в чем может быть загвоздка? Или может быть предложите другую реализацию «виртуальных» страниц?
Комментарии: 6
Работа с OnPageNotFound по определению чуть медленнее, потому что сайту сначала нужно понять, что запрошенной страницы нет, потом выдать событие, а потом снова искать нужную страницу, но уже через твой плагин.
Правда, обычно речь не идёт 0,1-0,15 сек. Например, у нас здесь весь раздел пользователей работает на OnPageNotFound и, вроде, не тормозят.
Попробуй заменить Wayfinder на pdoMenu.
Правда, обычно речь не идёт 0,1-0,15 сек. Например, у нас здесь весь раздел пользователей работает на OnPageNotFound и, вроде, не тормозят.
Попробуй заменить Wayfinder на pdoMenu.
Пробую реализовать страницы через кастомную таблицу, использую событие OnPageNotFound. Если открывать несколько страниц, то кешируется первая страница и почему-то показывается на всех последующих. Не скажите, почему так происходит?
Посмотрите на моё решение github.com/vanchelo/modxFastRouter
Можно попробовать повесить плагин на событие OnHandleRequest, но придется изменить немного логику плагина
Еще вариант — на событии OnMODXInit проверять $_REQUEST['q'] на соответствие собственному шаблону и, если подходит, часть uri отправлять в качестве get параметра, в q оставив только адрес существующего ресурса.
Возможно, костыльное решение, однако в некоторых случаях может быть весьма оправданным.
Возможно, костыльное решение, однако в некоторых случаях может быть весьма оправданным.
Плюс: нет события OnPageNotFound и связанных с ним замедляющих механизмов.
Минус: зашитая в коде маршрутизация. Подходит только для малого количества очень редко меняющихся шаблонов.
Сильный минус: нестандартный подход, усложняющий понимание иными разработчиками.
Минус: зашитая в коде маршрутизация. Подходит только для малого количества очень редко меняющихся шаблонов.
Сильный минус: нестандартный подход, усложняющий понимание иными разработчиками.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.