Надежно ли использовать 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. Поскольку соединение открыто, пока пользователь находится на веб-сайте, создаст ли это уязвимости?

person Observer    schedule 03.06.2017    source источник


Ответы (2)


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

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

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

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

  • Устаревшая технология, поэтому более широкая поддержка браузеров
  • Явный контроль над интервалом таймера, чтобы вы могли контролировать баланс между задержкой и нагрузкой на сервер.
person Darren Cook    schedule 05.06.2017

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

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

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

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

person soueuls    schedule 05.06.2017
comment
вы можете сказать, как реализовать socket.io? Я серфил об этом, но не могу понять это - person Observer; 05.06.2017