Как измерить, сколько посетителей на моей странице сейчас? - PullRequest
1 голос
/ 27 января 2012

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

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

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

Есть мысли?


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

Ответы [ 6 ]

1 голос
/ 27 января 2012

В зависимости от имеющейся у вас емкости сервера вы можете использовать повторяющиеся запросы к файлу .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 запросов в час для вашей базы данных! Здесь необходима сильная оптимизация ...

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

1 голос
/ 27 января 2012

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

0 голосов
/ 27 января 2012

Обычно вам нужна таблица с 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;
0 голосов
/ 27 января 2012

Лучше всего использовать Google Analytics

http://www.google.com/analytics/

0 голосов
/ 27 января 2012

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

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

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

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

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

0 голосов
/ 27 января 2012

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...