Эффективная перезагрузка данных / передача данных с сервера на клиент

Я ищу «способ пойти» (т. Е. Наиболее эффективный, наиболее используемый, общепринятый способ), когда речь заходит о перегрузке данных с веб-сервера на передний план. В конце приложения у меня будет несколько полей вывода, в которые должны быть записаны данные, например:

введите описание изображения здесь

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

Я думал об использовании Ajax-запросов для обновления как каждую секунду, но должен быть другой способ сделать это. Запросы Ajax вызовут большой трафик данных. Кроме того, при использовании чата Facebook вам не нужно ждать каждую секунду, чаты принимаются почти мгновенно. Тем не менее, я не вижу никаких запросов на опрос Ajax, когда я использую инструменты разработчика Mozilla Firefox. Это заставило меня подумать, будет ли другой способ сделать это.

Я просмотрел Node.js, но, похоже, это невозможно с моим хостом.

Я слышал, как люди говорили о Ajax Push, это то, что я должен использовать? Если да, можете ли вы дать мне пример использования?

Если нет, что тогда будет, когда нужно иметь несколько потоков данных, которые необходимо перезагрузить за секунду?

Требования – скорость и низкий трафик данных . Поэтому я думаю, что это не будет возможностью постоянно опроса сервера, потому что это создаст огромные накладные расходы.

Я не думаю, что это имеет значение, но я использую PHP5.3 в конце и JavaScript с jQuery 1.9.1 в интерфейсе.

Этот вопрос задавался несколько раз, но несколько иначе. Вот несколько ссылок, которые стоит прочитать:

  • Что такое Long-Polling, Websockets, Server-Sent Events (SSE) и комета?
  • Использование кометы с PHP?
  • Apache с поддержкой Comet
  • Масштабируемость сервера – веб-узлы HTML 5 против кометы
  • Как реализовать прослушивание событий в PHP

Вкратце : если вы смотрите на создание своего решения с помощью PHP на Apache, то сохранение открытых постоянных соединений (длительный опрос или потоковое HTTP-сообщение) будет очень быстро использовать ресурсы (крайне неэффективно). Таким образом, вам будет лучше использовать размещенное решение (* отказ от ответственности – я работаю для хостинга решения).

Протокол HTTP-Long и потоковое HTTP-потоки – это решения, которые были заменены событиями Server-Sent и WebSockets. Итак, где это возможно (где веб-клиент обеспечивает поддержку), вы должны использовать одно из этих решений, прежде чем вернуться к HTTP-решению. Хорошая веб-технология в реальном времени автоматически справится с этим для вас.

Поскольку ваша диаграмма показывает, что вы подписались на несколько потоков данных, вы также должны рассмотреть решение Publish / Subscribe, которое, естественно, соответствует этому. Опять же, хорошее веб-техническое решение в реальном времени предоставит вам это.

Также см. Руководство по технологиям в реальном времени .

Я думаю, что то, что вы ищете, обычно называется Comet . Этот метод часто использовался для работы:

  • Клиент (веб-браузер) делает запрос на сервер для новых данных. Это не перезагрузка страницы, а выполняется в JavaScript.
  • Сервер отвечает на запрос, когда он имеет некоторые данные для клиента. Опять же, это не влияет на пользовательский интерфейс, так как не перегружается сама страница: loaindg данных выполняется «в фоновом режиме», так сказать, в коде JavaScript.
  • На стороне обслуживания запрос ожидает новых данных и возвращает новые данные, когда они доступны, или ничего не возвращает, если достигнут интервал времени ожидания (определенный на сервере). Этот тайм-аут обычно устанавливается ниже таймаута HTTP-браузера. Причина этого заключается в том, что сервер может узнать, получил ли конкретный клиент конкретный фрагмент данных. Если запрос разрешен тайм-аут на стороне клиента, первоначальный запрос может быть отправлен сервером после истечения срока ожидания клиента, и клиент не получит данные, даже если сервер считает, что он это сделал.

Обычно данные передаются как JSON, но вы можете выбрать любую кодировку, которую хотите. См. Здесь один пример того, как это сделать. Goosh – еще один пример этой техники, а также Interactive Python Shell . Код для всех доступен.


На стороне PHP вы захотите создать страницу, которая будет отвечать на эти «фоновые» запросы комета JavaScript. Это может быть та же самая страница, что и пользователь, загружающий, но, скажем так, это другое, для удобства объяснения. Таким образом, пользователь загружает index.php и код комета JavaScript Comet getNewData.php для получения новых данных.

В вашем getNewData.php вы захотите дождаться своего события и затем вернуть данные. Вы не хотите использовать опрос для этого, но есть библиотеки PHP, которые позволяют использовать различные стратегии взаимодействия между процессами, чтобы ждать событий, например , см. Этот вопрос . Высокоуровневый псевдокод для вашего getNewData.php выглядел бы следующим образом:

  1. проанализировать запрос JSON
  2. Введите эффективное состояние ожидания (с таймаутом), ожидая события «новые данные доступны»
  3. Был ли предыдущий тайм-аут?
    Да: отправить ответ, указывающий отсутствие данных
    Нет: отправить ответ с новыми данными