Поиск общего количества активных сеансов

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

Я googled, и некоторые люди говорят, что это возможно, подсчитав общее количество временных файлов сеанса в каталоге temp. Но где он находится?

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

Все веб-сайты, которые позволяют показывать количество посетителей, используют обработчики сеансов базы данных (это может быть mysql db или даже memcached).

Структура таблицы сеансов:

CREATE TABLE `sessions` ( `id` INT NOT NULL , `session_id` VARCHAR( 32 ) NOT NULL , `user_id` INT NOT NULL , `last_seen` DATETIME NOT NULL ) ENGINE = InnoDB; 

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

Идентификатором пользователя будет текущий идентификатор пользователя, или NULL, если он гость.

Каждый раз, когда пользователь обновляет страницу, вы должны обновить таблицу session :

  • Обновить last_seen, если сеанс уже существует в базе данных
  • Добавьте новую строку для каждого нового посетителя,
  • Изменение значения user_id при входе пользователя в систему или выходе из системы
  • удалить истекшие сеансы

На этом этапе вы можете получить все посетители, используя простой sql-запрос:

 SELECT COUNT(`user_id`) AS users, (COUNT(*) - COUNT(`user_id`)) as guests FROM `sessions` WHERE `last_seen` >= DATE_SUB(NOW(), INTERVAL 15 MINUTE) 

Я улучшаю ответ от пользователя @ user2067005. Вам действительно нужно вычесть 2 из счета, потому что scandir сообщает об этом . и .. записи.

 $number_of_users = count(scandir(ini_get("session.save_path"))) - 2; 

Это будет подсчитывать количество сеансов, открытых одновременно.

 $number_of_users = count(scandir(ini_get("session.save_path"))); 

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

На каждой странице вставьте ip и время в эту таблицу.

Затем вы можете получить различные IP-адреса, нажатые не более 15 минут назад. Продолжительность строго зависит от вашего контента, это может быть даже 10 секунд или 1 час. Спросите себя, был ли вы своим посетителем, сколько вы будете заниматься серфингом на своем сайте и быть честным, конечно 🙂

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

Да, мы можем сканировать папку хранения temp/ folder OR session session.save_path для всех файлов сеанса, но она всегда не гарантирует правильные результаты несколько раз даже после уничтожения сеанса session_destroy() папка хранения сеанса содержит файлы сеанса выведенного из системы пользователя. В этом случае вы получите неправильный результат. А также, если вы запустите phpmyadmin(MySQL) он создаст собственный файл сеанса.