PHP: наиболее эффективный способ отслеживания, если пользователь находится в Сети?

я разрабатываю свой проект с учетом масштабируемости, и я пришел к перекрестку. На моем сайте я хотел бы определить, является ли пользователь онлайн или нет. И я не могу придумать лучший способ справиться с этим. То, как я думал, будет что-то в этом роде(в psuedocode):

// SQL user table:
user {
  "name": "blah blah",
  "email": "derpy@derpyderp.com",
  "online": false
}

поэтому всякий раз, когда пользователь входит в систему, я могу обновить его до true. Однако это в конечном итоге приведет к SQL-запросам, происходящим каждый раз, когда пользователь входит в систему, и если это случается, что я получаю, скажем, 10 Логинов в секунду, ну,это много запросов. По-другому я решил, что могу сделать то же самое, но в другой таблице:

// Activity table:
activity {
  "user_id": 2,
  "online": true
}

по какой-то причине я считаю, что это приведет к меньшему потреблению памяти из-за отделения от user таблица. Однако я не уверен, будет ли это иметь какое-либо фактическое влияние на производительность.

3 ответов


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

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


вы можете использовать datetime для типа поля и не забудьте записать IP-адрес пользователя, чтобы вы могли отслеживать время o


в зависимости от того как вы хотите работать, вы в основном есть два варианта:

определите тайм-аут, после которого вы считаете, что пользователь вышел из системы Используйте ajax / websockets / что угодно, чтобы опросить пользователя

       1: Timeout

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

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

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

      2: Constant polling

это немного сложнее реализовать из-за необходимости обновления сервера с помощью Ajax. В противном случае он работает аналогично #1.

всякий раз, когда пользователь находится на странице, вы можете держать websocket открытым или выполнять ajax-запросы каждые N секунд на сервер.

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

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