Могу ли я подсчитывать сеансы, чтобы определить количество людей в Интернете?

Я чем-то смущен. Когда я пытаюсь найти, как подсчитывать пользователей в Интернете на PHP, все ответы, связанные с MySQL и разными способами.

В моем скрипте любой пользователь, который отправляет регистрационную форму, создает $ _SESSION ['$ nickname']

Поэтому я подумал, могу ли я подсчитывать сеансы входа со счетом ($ _ SESSION ['$ nickname']); и показать его на моей странице?

Или это совершенно неверная логика?

Related of "Могу ли я подсчитывать сеансы, чтобы определить количество людей в Интернете?"

Совершенно неправильная логика. $ _SESSION – вещь для пользователя. Один сеанс пользователя не используется совместно с сеансом другого пользователя. Подумайте об этом – онлайн-банк, написанный на PHP, все из которых разделяют одну $ _SESSION – каждый увидит все данные учетной записи пользователя.

Предполагая, что вы находитесь на стандартных сессиях на основе PHP-файлов, вы можете считать файлы сеанса в любом каталоге, который они хранят, например

$users = count(glob(session_save_path() . '/*')); 

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

Сначала вы должны определить, что означает «быть онлайн». Должен ли пользователь нажать ссылку в течение последних 5 минут?

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

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

А на вашей странице статистики и т. Д. Вы получаете количество онлайн- пользователей с этим кодом:

 SELECT COUNT(*) FROM users WHERE lastAction > (NOW() - 60*5) 

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

Однако хранилище сеансов по умолчанию – это files , где каждый сеанс индивидуально хранится на диске. Это означает, что для того, чтобы узнать, сколько пользователей есть « онлайн » (здесь я предполагаю, что « онлайн = сеанс существует с $_SESSION['$nickname'] set "), вам нужно будет открыть все файлы сеансов, хранящиеся на диске и проверить, сколько уникальных прозвищ существует внутри них. Это очень тяжело как во время, так и в необходимых ресурсах.

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

Если вы хотите объединить, то это можно сделать, определив собственный обработчик сохранения сеанса для хранения информации о сеансе в базе данных …


Несколько дополнительных заметок о сессиях:

  • Сессии сразу не уничтожаются при закрытии браузера. Фактически, браузер не сообщает серверу, что он закрыт. Это означает, что сервер должен придумать некоторый алгоритм, основанный на времени, чтобы решить, кто в сети, а кто нет.
  • Сеансы изолированы друг от друга, поэтому $_SESSION["foo"] не может использоваться несколькими различными сеансами – в PHP нет эквивалента Global.asa . Не из коробки.

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

Лучше всего иметь временную метку для каждого пользователя, которая обновляется всякий раз, когда пользователь делает что-либо. Это означает, что вам нужно будет запустить это обновление через JS / AJAX, PHP. Затем вы можете проверить, сколько временных меток находится за последние 5 минут, например, и это даст вам общее представление о том, сколько пользователей в настоящее время в сети.

У вас также может быть скрытый iframe, который постоянно обновляется каждые несколько секунд и обновляет метку времени, или JS / AJAX, которая обновляет метку времени каждые X секунд …