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