2012-01-27 2 views
1

Для веб-приложения, которое я пишу, это будет ключом для измерения с частым интервалом (каждую минуту или около того), сколько посетителей находится в определенной части моего приложения прямо сейчас. Скажем, мое приложение имеет 10 подразделов, которые переключаются между использованием JavaScript и выполняются постоянными с помощью хеш-привязок стиля #!/page8. Каким будет лучший способ сделать это точно?Как измерить, сколько посетителей на моей странице имеет прямо сейчас?

Мой текущий план состоит в том, чтобы просто сохранить сумму в базе данных, добавляя и вычитая каждый раз, когда пользователь нажимает на страницу или покидает страницу. На самом деле это не очень хорошее решение для меня. События для отслеживания остатков страниц могут быть отменены из-за закрытия браузеров, люди могут закручивать данные, выполняя вызовы API для посещения/выхода и т. Д. Было бы очень много работать над надежностью.

Редактировать: Чтобы уточнить, мое приложение не будет иметь учетных записей пользователей. Также я не просто пытаюсь зарегистрировать, сколько посетителей у меня было на страницах. Я пытаюсь точно узнать, сколько посетителей на на моей странице прямо сейчас. Это означает, что мне понадобится какой-то надежный способ узнать, что посетитель больше не находится на моей странице. Вот в чем проблема. Я просто получил яркую идею о том, что у меня может быть, что JavaScript на своей странице уведомляет мой сервер каждые 10 секунд или так, что они все еще там, и их посещение будет отключено и удалено, если они этого не сделают. Будет ли это работать? Разве это не могло быть проблемой для моего ненадежного сервера, если бы я получал тысячи людей, использующих мое приложение одновременно?

Любые мысли?


Я мечение это с большим количеством тегов развития общего веба, так как это очень открытым вопрос, и любые из этих тегов могут содержать ответ

+0

Почему вы не используете что-то вроде Google Analytics или Piwik? Есть также несколько коммерческих продуктов, которые обеспечивают отслеживание в реальном времени, например, clicktale. – mobius

+0

Зачем ему использовать инструменты Google, когда требуется 50-100 строк кода, чтобы написать эту модель urself? и сделать его персонализированным ... – Tudor

+0

@TudorTudor Если мы говорим о высоко посещаемом веб-сайте, я не думаю, что только 50-100 строк кода будут делать. Или они могут работать день или два. – mobius

ответ

1

В зависимости от мощности сервера у вас есть вы можете использовать повторяющиеся запросы на .php файл, который будет держать пользовательские сеансы след в живых. Но будьте осторожны - это вызывает потерю нагрузки на сервере, так что идите так, если вы осознаете последствия!

С помощью session_start(); вы можете написать собственный идентификатор сеанса в таблице базы данных с такими полями, как ID, ip_addr, session_track_id, timestamp. Не используйте сам session_id, поскольку это может быть проблемой безопасности. Обновите метку времени в каждом .php, который вы вызываете.

Кроме того, создайте пользовательский .php, где обновляется только метка времени. Вызовите это через jQuery AJAX-вызовы каждые 60 секунд (или любой необходимый вам интервал). Вы также можете использовать некоторую безопасность для этого шага, чтобы избежать прямого вызова API, о котором вы говорили. Например, введите следующий идентификатор запроса, который возвращается в вызовах AJAX и должен быть параметром следующего, если это не так, метка времени не будет обновляться.

Создайте cron, который запускается каждые 90 секунд (или любой необходимый вам интервал - но дольше, чем в вызовах AJAX). Этот cron будет искать записи в таблице старше X секунд и удалять их.

Чтобы узнать, сколько активных пользователей просто подсчитывает строки в таблице.

Существуют дополнительные варианты безопасности, которые могут использоваться в этом подходе.

Это решит вашу ситуацию - когда пользователь закроет свое окно, никакие вызовы AJAX больше не будут загружать сеанс, и через несколько секунд он будет удален из базы данных (90 в приведенном выше сценарии).

Однако - считайте, что, когда вы выдаете запрос каждые 60 секунд, и у вас есть 1000 пользователей в Интернете, это не менее 60 000 запросов в час для вашей базы данных! Сильная оптимизация является обязательным условием ...

Это решение отлично работало для меня в одном проекте.

+0

I Я использую node.js, поэтому я думаю, что проблема с загрузкой не должна быть такой же проблемой. И это в значительной степени решение, которое я имел в виду, поэтому мне это нравится. Кажется, что это единственный ответ, который фактически решает мою проблему, как узнать, когда пользователи уходят. +1 – Hubro

+0

Ну, это не вопрос запросов, это вопрос запросов к базе данных. Но, конечно, это управляемо. Также подумайте о проблемах с кешированием, вы можете добавить либо следующий идентификатор запроса, который является уникальным для каждого запроса, либо случайным параметром для запросов, иначе вы можете столкнуться с проблемами кеширования в разных браузерах ... Я попытаюсь найти код образцы для вас ... – Michal

+0

К сожалению, больше не могу найти код, прошло некоторое время с тех пор, как я работал над этим. Однако это не сложно, я оптимист, что вы найдете свой путь. – Michal

1

не пробовал сам, но вы может проверить какой-нибудь инструмент, например http://mixpanel.com/

0

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

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

Таким образом, вы можете легко графически отобразить историю посетителей, а также дать мгновенный ответ на количество «текущих» посетителей.

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

Другим преимуществом является то, что запросы страницы не будут блокировать таблицу для каждого запроса. В то время как приращение/уменьшение счетчика. В зависимости от уровня трафика встречный подход будет иметь отрицательное влияние на производительность.

Используя журнал, вы избегаете проблемы с блокировкой и по существу переместите свертывание во внешний процесс, такой как задание SQL.

0

Я видел некоторые варианты вокруг сети, но я лично использую это:

хранить метку времени в таблице пользователей в базе данных, которая обновляется каждый раз, когда пользователь актов (щелкает ссылку или так)

Что вам нужно сделать, это просто заставить всех пользователей, чтобы их последнее действие было X секунд назад, проверив метку времени. Таким образом, вы можете иметь имена пользователей, которые активны вместе с их номером.

Также время, когда вы можете сказать, что человек активен, полностью настраивается.

Этот способ используется для всего сайта. Для разных страниц у вас может быть другая таблица для хранения активности и идентификатора страницы или чего-то еще. Используйте свое воображение. :)

0

В основном вам нужен стол с 3-мя полями:

user_activity - user_id - last_access_timestamp - last_visited_page

Каждый раз, пользователь запрашивает данные last_access_timestamp и last_visited_page ДОЛЖЕН быть обновлен. Обратите внимание, что вам необходимо отправить # page8 часть вручную, так как она НЕ доходит до сервера!

Затем вам нужно определить, когда пользователь считается неактивным. Предположим: 15мин.

#To get total users: 
SELECT * FROM user_activity WHERE last_access_timestamp > NOW() - 15*60; 

#To get total users for page #page8: 
SELECT * FROM user_activity WHERE last_visited_page LIKE '%page8' AND last_access_timestamp > NOW() - 15*60; 
Смежные вопросы