Программизм |
|||||||
|
|||||||
Статистика посещений сайта на PHPС чего всё начиналосьНачиналось всё с широко известного в узких кругах скрипта от Spectatorа. В одной из статей Дмитрий предупреждал, что в скрипте имеется «дырка», поэтому перед использованием он был немного модифицирован и обезжучен. Реализация некоторых вещей показалась неоптимальной, потом захотелось чего-то, чего изначально не было... В результате получилась система более точная, чем бесплатный счётчик типа Mail.ru и, на мой вкус, более удобная для чтения. Собственно, XPEHOMETP™ (читается «кспехометп») — это всего лишь набор достаточно универсальных функций, а внешний вид отчётов легко настраивается под любые требования. В этой статье я постараюсь рассказать о том, из чего состоит программа и какие задачи были решены при её написании. Порядок описания — тот, который кажется наиболее логичным, в действительности последовательность написания была совсем не такая. Откуда брать исходные данные?Исходный скрипт при каждом обращении к странице делает запись в файл — туда записывается время визита, имя поискового сервера и строка поиска. Схема вполне работоспособна, но её недостатки очевидны: во-первых, если меняется функция, распознающая поисковые сервера, то старые данные не изменятся, во-вторых, при каждом обращении к сайту выполняются достаточно сложные вычисления, хотя при небольшой посещаемости это и некритично. Но самое главное, что если визит был не с поискового сервера, то сохранить его в таком формате невозможно. В результате было принято решение записывать в файл каждое обращение, независимо от того, откуда пришли на сайт. В файл пишутся IP посетителя, время визита, страница, на которую от пришёл и страница, с которой он пришёл. «Позвольте, — скажет пытливый ум, — но ведь если так, то проще взять готовые логи web-сервера!» Сложно не согласиться с этим утверждением, если, конечно, провайдер даёт доступ к логам. Net.ru такой доступ даёт, причём логи разбиты по дням, а старые автоматически удаляются, что очень удобно. Отчёты на этом сайте формируются именно из логов сервера, но функциональность, позволяющая вести свой лог, в библиотеке оставлена. Использование логов web-сервера порождает несколько проблем:
Для решения проблемы 1 была написана функция Проблемы 2, 3 и 4 решаются передачей функции чтения в качестве параметра регулярного выражения, которое выбирает только удачные (завершившиеся с кодом 200) обращения к страницам нужного сайта. Порядок полей передаётся отдельным параметром. Проблема 5 решается передачей ещё одного регулярного выражения, например, Есть и ещё одна проблема — многие провайдеры имеют развитую систему зеркал и прокси-серверов, поэтому часть обращений до web-сервера не доходят. Для того, чтобы документы в кэше не залёживались, существуют специальные заголовки протокола http — <? header("Cache-control: no-cache"); header("Pragma: no-cache"); ?> Правда, практика показывает, что большинство прокси-серверов эти заголовки игнорирует, поэтому единственный эффективный способ — явно указать время, после которого страница становится недействительной: <? header("Expires: ".gmdate("D, d M Y H:i:s",time()+60)." GMT"); ?> Срок действия документа заканчивается через минуту после его генерации — это позволяет избежать записи в логе, если интервал между запросами одного и того же документа меньше минуты, то есть произошёл возврат назад. Итак, мы получили массив, содержащий все обращения к сайту за период. Что делать дальше? Дальше — большеВидать, в предыдущем абзаце я перехвалил Net.ru, и аккурат в момент написания статьи случился у них переход на новый алгоритм генерации логов. Из-за этого на экран полезли warningи, и пришлось при чтении файла сначала проверить его наличие при помощи Мало того, оказалось, что дата в названии файла вовсе не говорит о том, что в нём данные только за указанный день. Приходится читать лог-файлы с некоторым запасом в обе стороны, а записи дополнительно фильтровать по времени. После этого информация, выводимая на экран, стала более-менее согласованной. Кроме того, оказалось, что округлив timestamp до 86400, мы не получим полночь — сказывается удалённость от Гринвича. Поэтому пришлось наворачивать Формирование общей статистикиДля начала следует понять, какие «общие» вопросы нас интересуют:
Количество обращений считается элементарно — это просто количество элементов в массиве. Количество же хостов — это количество различных Есть ещё один способ подсчёта хостов — посчитать количество визитов, где поле Количество визитов по ссылкам и визитов с поисковых серверов тоже определяется просто — по полю Ну, и количество новых посетителей тоже определяется просто — заводится хэш, ключом в котором будет IP-адрес. Если к тому моменту, как обрабатывается очередной визит, такого адреса в хэше не нашлось, значит, адрес новый. Очевидно, что если считать статистику только за один день, то все хосты будут новыми. Для того, чтобы этого избежать, статистика за период сохраняется в файл, а при выводе статистики за день количество новых хостов берётся из этого файла. Этот же файл решает ещё одну задачу — сохраняет общую статистику за прошлые периоды, логи которых уже уничтожены. Ну, и визитами в корень сайта считаются обращения, где Замечу, что все вычисления происходят в одном цикле, за счёт чего и достигается приемлемое время работы скрипта. Анализ рефереровВ принципе, анализ реферера мало чем отличается от того, что описан в вышеупомянутой статье на Spectatorе. Правда, длинный набор из Самое интересное при анализе визита с поискового сервера — разобрать запрос, по которому попали на сайт. Исходный алгоритм был слишком упрощён — в нём не учитывались сохранённые запросы, т.е. ситуации, когда человек «ищет в найденном». Тут для каждого поискового сервера свой алгоритм, часто весьма заковыристый. Самый, пожалуй, сложный разбор запроса у Яндекса. Ещё один интересный момент — кодировка запроса. Сейчас многие сервера, рассчитанные на работу с разными языками, выдают текст в Unicode, а для кодирования этого текста используют
Теоретически можно перекодировать текст прямо из Ещё интересно понаблюдать, как клиент уточнял свой запрос. Бывают товарищи, которые активно пользуются языком запросов, но гораздо чаще ищут что-то, а потом проводят уточняющий поиск в найденном. Во втором случае скрипт самостоятельно расставляет скобки и связки (как правило, Ну, а если реферер не является поисковым сервером, то мы просто разбираем его адрес на составные части, на экран выводим только название хоста, а в атрибуте Вывод результатовВот здесь открывается полная свобода творчества. Единственный элемент, который может быть общим для всех сайтов и при этом требует написания нетривиального кода — вывод наиболее популярных страниц или рефереров. Для этого я написал специальную функцию, которая подсчитывает общее количество хитов, а потом выводит некоторое количество (или все) наиболее популярных объектов, указывая процентное соотношение хитов с/на этот объект ко всем хитам. Если взять первые 16 элементов, то получится Что в планах?Во-первых, надо будет дописать анализ броузера, с помощью которого происходило обращение к страницу. Не то, чтобы меня сильно волновала эта проблема, просто надо фильтровать обращения «пауков» поисковых систем. Во-вторых, надо научиться рисовать какие-нибудь графики. Не то, чтобы они кому-нибудь нужны, просто «так положено». Ну, и в-третьих, надо нарисовать какую-нибудь модную кнопку. А пока есть вот что: Ну, а если есть какие-то идеи или желание приобрести скрипт — пишите письма. Удачи! 31.07.2003 |
ПоискСм. такжеДля начала следует понять, какие вопросы нас интересуют: pазумеется, хиты и хосты, количество визитов по ссылкам, количество визитов с поисковых серверов — это, фактически, случайные посетители... »»» архив с драйвером занимает около во-первых, процедуру копирования нужно вызвать из программы на VisualBasic, а во-вторых, у пользователя нет прав на запись в каталог... »»» Рекомендую
e.g.Orius Copyright noticeъ) Все материалы, размещённые на странице, являются неотъемлемой собственностью автора с вытекающими отсюда правами, как ©, так и (ъ). Некоммерческое их распространение всячески приветствуется, разумеется, при условии сохранения ссылки на оригинал. Что касается коммерческого использования — пишите письма, договориться можно всегда. Удивительное рядом
Пишите письма
Счётчики |