Я использовал метод EventSource для получения онлайн статуса активных пользователей на моем сайте.
В этом следующем коде JavaScript вставляется в каждую страницу
var source = new EventSource("set_online.php");
Таким образом, этот код выполняется set_online.php
файл постоянно.
На стороне сервера, т.е. в set_online.php
следующий код выполняется
$query = "UPDATE my_db SET last_active = '{$current_time}' WHERE id = {$_SESSION["id"]}";
$result = mysqli_query($connection, $query);
Теперь у меня есть две проблемы по этому поводу:
SSE не подходит для этой цели — или, по крайней мере, не предназначен для этого. SSE — это постоянный поток событий от сервер в браузер.
Ваш сценарий будет работать, хотя. PHP-скрипт выполнит одно действие (обновит базу данных) и завершит работу. Когда он выходит, соединение закрывается. Браузер увидит, что соединение разорвано, и через несколько секунд снова подключится. Когда цикл повторяется.
По поводу ваших двух вопросов:
1. Это на самом деле не непрерывно, более повторное подключение каждые 3 секунды. Нагрузка на сервер может быть значительной.
2. Соединение не открыто постоянно; но если это так, то это не создает никаких новых уязвимостей.
Я бы использовал вызов ajax на интервале JavaScript вместо SSE. Эти преимущества:
Ваше решение является тяжелым и ненужным, лучшим решением было бы обратить вспять идею и позволить серверу передавать информацию о статусе пользователя вашим клиентам.
Вы можете добиться этого путем реализации сокетов с использованием таких библиотек, как socket.io. Это довольно просто достичь и является более масштабируемым решением.
По сути, когда страница загружена, между вашим клиентом и сервером будет установлено соединение, и когда сервер захочет связаться с клиентами, он может просто создать событие, такое как user-status
например.
Ваши клиенты могут просто прослушать это событие и соответствующим образом обновить свои взгляды.