отображение в реальном времени для других пользователей, которые также онлайн? - PullRequest
2 голосов
/ 21 декабря 2011

Как Facebook заботится о своих данных в режиме реального времени? если вы просматриваете фид активности и пользователю что-то нравится, вы можете сразу увидеть изменение текста, говорящего о том, что этому пользователю понравилось, или когда вы получите уведомление, вы увидите красный знак уведомления на странице без обновления ,

Я знаю, что этот код может выдвигать данные без обновления:

$.post('ajax/test.html', function(data) {
  $('.result').html(data);
});

Но может ли кто-нибудь объяснить, как передавать данные в реальном времени, чтобы другие пользователи могли видеть обновления на своей странице без обновления.

Спасибо

Ответы [ 3 ]

6 голосов
/ 21 декабря 2011

Это может быть реализовано с использованием различных методов, которые имеют много имен: Long-polling, Server Sent Events, Comet, WebSockets и др.

Основная идея такова:

  • Алиса открывает фейсбук.Ее браузер отправляет запрос на обновления (например, $.get), но сервер не отвечает, если нет новых обновлений и запрос остается в состоянии ожидания.

  • Боб открывает фейсбук.Он решает прокомментировать стену Алисы.Его браузер публикует свой комментарий на сервере ($.post).

    • Сервер принимает это сообщение, обрабатывает его должным образом (сохраняет на стене Алисы и т. Д.)
    • Но сервер ТАКЖЕ проверяет, есть ли ожидающий запрос на обновление от Алисы.Если это так, сервер выводит информацию об этом обновлении в поток ответов и закрывает соединение.
  • Браузер Алисы наконец получает ответ на этот длинный запрос зависания и радостно рисует красный "1 "в области уведомлений.Он также немедленно открывает еще один запрос на обновление (чтобы не пропустить ни одного).

  • Алиса видит комментарий от Боба, который был доставлен мгновенно.

Описанная методика называется «длинный опрос» и впервые была введена Google в Gmail.

2 голосов
/ 21 декабря 2011

Существует несколько решений этой проблемы, и вам придется провести некоторое исследование, чтобы решить, что вы хотите реализовать.Некоторые из этих решений совместно именуются как Comet (http://en.wikipedia.org/wiki/Comet_%28programming%29)

. Метод, используемый Facebook - это Ajax Long Polling. В этом методе выполняется вызов ajax на сервер, и сервер ожидаетотвечайте, оставляя соединение зависшим, пока не произойдет обновление или не будет достигнут максимальный промежуток времени. Если в течение этого интервала получены новые данные, скажем, сообщение чата, он немедленно отвечает данными. В конце каждого вызова клиентзатем запускает новый вызов ajax и ждет. Если вы просматриваете консоль браузера на Facebook, вы можете увидеть эти вызовы.

Следующий метод называется навсегда фреймом, где используется скрытый iFrame, и он непрерывно отправляет фрагментированную дату иникогда не завершает загрузку. Эти данные читаются основным фреймом по мере их поступления.

Еще одно решение, которое только что становится доступным, - это WebSockets. WebSockets - это действительно двустороннее постоянное соединение для браузеров, и оно очень мощное.на ранних стадиях и до недавнего пересмотраИон был заблокирован некоторыми браузерами из-за проблем безопасности.

0 голосов
/ 21 декабря 2011
  1. Создайте сценарий PHP, который извлекает все соответствующие обновления и выводит их в формате JSON.
  2. Настройте JavaScript, чтобы запрашивать этот сценарий PHP через определенный промежуток времени, и обновляйте соответствующие элементы.
...