javascript — Надежно ли использовать EventSource для получения онлайн статуса пользователя?

Я использовал метод 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);

Теперь у меня есть две проблемы по этому поводу:

  1. Поскольку база данных постоянно обновляет last_active в реальном времени, повлияет ли это на нагрузку на сервер?
  2. Поскольку соединение открыто, пока пользователь находится на веб-сайте, будет ли оно создавать уязвимости?

2

Решение

SSE не подходит для этой цели — или, по крайней мере, не предназначен для этого. SSE — это постоянный поток событий от сервер в браузер.

Ваш сценарий будет работать, хотя. PHP-скрипт выполнит одно действие (обновит базу данных) и завершит работу. Когда он выходит, соединение закрывается. Браузер увидит, что соединение разорвано, и через несколько секунд снова подключится. Когда цикл повторяется.

По поводу ваших двух вопросов:
1. Это на самом деле не непрерывно, более повторное подключение каждые 3 секунды. Нагрузка на сервер может быть значительной.
2. Соединение не открыто постоянно; но если это так, то это не создает никаких новых уязвимостей.

Я бы использовал вызов ajax на интервале JavaScript вместо SSE. Эти преимущества:

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

Другие решения

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

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

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

Ваши клиенты могут просто прослушать это событие и соответствующим образом обновить свои взгляды.

1

По вопросам рекламы [email protected]