При разработке сайтов одного из наших клиентов мной был замечен странный глюк: по какой-то непонятной причине происходило удвоение количества просмотров страниц, в частности это проявлялось в следующем:
- Удвоение числа просмотров элементов информационных систем;
- Удвоение числа просмотров товаров магазина;
- Внутренняя статистика посещаемости HostCMS показывала ровно в два раза больше посещений;
Проверяется это очень просто. Если на странице отображается количество её просмотров, то достаточно просто обновить страницу и посмотреть, насколько увеличился счётчик просмотров. Должно быть, конечно, увеличение на +1. А почему-то происходило увеличение на +2 при каждом заходе на страницу.
Где посмотреть количество просмотров элемента ИС и товаров магазина
В XML за это отвечает тег showed. Если он у вас отсутствует в XML, то проверьте настройки запрещённых тегов в типовой динамической странице инфосистемы или магазина.
Перед тем как рассказать о причине этого странного поведения, сначала расскажу о процессе поиска ошибки. Если вам сразу хочется узнать в чём дело, пролистайте вниз.
Как я искал причину удвоения статистики посещаемости
Прежде всего нужно было проверить, не запрашивается ли открываемая страница два раза. Однако консоль в Google Chrome показала, что страница открывается только один раз, в том числе нет никаких AJAX запросов (а именно на это и было подозрение в первую очередь: например, всякие JavaScript счётчики и прочее).
После примерно часа различных проверок, размышлений и поисков в ядре HostCMS было принято самое простое решение — отключить всё лишнее. Первым делом вместо макета страницы (проверялось на примере товара магазина) был подключен пустой макет, то есть кроме Core_Page::instance()->execute() там ничего не было. Ошибка сразу же пропала и счётчик стал работать как надо.
Шаг второй — поиск "лишнего" в макете страницы. Подключил макет обратно и стал отключать все блоки кода, пока ошибка не исчезла. Оказалось следующее: в футере сайта выводились настраиваемые значки соцсетей через инфосистему. ИС была просто как хранилище данных, то есть с разделом не связана. Так вот, удвоение счётчика просмотров наблюдалось при выводе одного или более дополнительных свойств у этой информационной системы.
Для примера подключалась другая ИС (тоже с доп. свойствами) — ошибки не было. Это показалось странным — ошибка возникала только с данной ИС, а с другими — нет. В общем, какая-то непонятная магия...
Создание другой инфосистемы (вручную) и перенос данных туда ничего не дал. Как только включал вывод дополнительных свойств, так сразу же счётчики работали неверно (+2 вместо +1). Но хотя бы стало понятно, что дело не в самой инфосистеме.
Далее проверил, что будет если в XSL шаблоне, который связан с данной инфосистемой, отключить вывод данных. И вот тут и нашлось решение (опять же методом исключения, только уже в XSL файле). Решение оказалось неожиданным.
В чём причина удвоения статистики посещаемости
Причина оказалась в следующем. Посмотрите на картинку вверху страницы, на которой приведён фрагмент кода XSL шаблона. На скриншоте красным подчёркнут тег img, а конкретно — его атрибут src. В данном случае всё уже исправлено, но изначально было не так.
Причина удвоения посещаемости:
Если в теге img в качестве значения src указать символ # вместо пути к изображению, то наблюдается удвоение числа просмотров страницы. Возможно и другие значения тоже приводят к аналогичной ошибке, но дело было поздно ночью и проверять было некогда.
Таким образом, ошибка была исправлена заменой # ссылкой на картинку. Если кому-то интересно, зачем вообще было пустое поле вместо ссылки на изображение, то в данном случае так получилось, что сама картинка тут была не нужна. Лучше, конечно, так вообще не делать, но в данном случае просто пришлось бы менять очень много стилей, поэтому вместо картинки и была заглушка #.
Решение простое: заменил # ссылкой на однопиксельное прозрачное изображение (в моём случае!) и проблема исчезла.
Почему именно так происходит? Дело очевидно в том, что при указании # в качестве URL картинки браузер обращается непосредственно к той странице, на которой эта картинка выводится (можете убедиться сами в консоли браузера). А раз так, то будет срабатывать счётчик просмотров элемента инфосистемы или магазина, так как значение счётчика увеличивается при вызове функции show().