Обратный AJAX? Можно ли «сдвинуть» изменения данных в сценарий? - PullRequest
6 голосов
/ 10 августа 2009

Я заметил, что некоторые из моих ajax-сайтов (те, которые я посещаю, а не те, которые я построил), имеют определенные функции автоматического обновления. Например, в GMail, если я получаю новое сообщение, я вижу новое сообщение без перезагрузки страницы. То же самое и с IM-клиентом на базе браузера Facebook. Из того, что я могу сказать, нет никаких java-апплетов, обрабатывающих привязку сервер-браузер, так что я могу предположить, что это делает AJAX и, возможно, какой-то элемент, о котором я не знаю. Так что, по моему мнению, это делается одним из двух способов:

  1. javascript выполняет постоянный «пинг» сценария на стороне сервера, проверяя наличие любых доступных обновлений (что объясняет, почему некоторые из этих страниц приводят к сканированию любых других сверхмощных страниц). или

  2. Javascript бездействует, а серверный скрипт фактически «выталкивает» любые обновления в браузер. Но я не уверен, возможно ли это. Я предполагаю, что есть какая-то функция AJAX, которая все еще пингует, но все это просто запрашивает "какие-либо обновления?" а серверный скрипт имеет простое логическое значение, которое говорит «Нет» или «Я рад, что вы спросили». Но если это так, любые изменения данных должны вызывать скрипт напрямую, чтобы он был готов к изменениям данных и вносил изменения в эту булеву функцию.

Так это возможно / осуществимо / как это работает? Я представляю что-то вроде:

Кто-то отправляет на сервер обновление электронной почты / IM / DB, сервер вызывает сценарий, используя URL-адрес сценария плюс некоторую соответствующую переменную GET, сценарий записывает изменение и обновляет переменную «updates available», AJAX получает ответ что обновления действительно существуют, AJAX выполняет свои обычные функции «страницы обновления», которые выполняют обычные сценарии обновления и выводят их в браузер.

Я спрашиваю, потому что кажется действительно неэффективным, что js просто выполняет постоянную проверку, которая требует, чтобы: а) сервер работал каждые 1,5 секунды, и б) мой браузер выполнял работу каждые 1,5 секунды, чтобы я может сказать: «О, мальчик, я получил мгновенное сообщение! Как настоящий клиент IM!»

Ответы [ 2 ]

6 голосов
/ 10 августа 2009

Читать о Комета

0 голосов
/ 17 августа 2009

На самом деле я работал над небольшим .NET Web App, в котором описан метод Ajax с длинным опросом.

В зависимости от того, какую технологию вы используете, вы можете использовать механизмы потоковой сигнализации для удержания вашего запроса до получения обновления. В ASP.NET мой сервер работает на одном компьютере, поэтому я храню ссылку на мой объект Producer (который содержит поток, который обрабатывает данные). Чтобы инициировать извлечение данных, вызывается метод Subscribe моего сервиса, который создает объект Consumer, который зарегистрирован в Producer. Если получатель находится в режиме длительного опроса, у него есть AutoResetEvent, который сигнализируется всякий раз, когда он получает новые данные, и всякий раз, когда веб-клиент делает запрос данных, получатель сначала ожидает событие сброса, а затем возвращает его.

Но вы упоминаете кое-что о PHP - насколько я знаю, постоянство поддерживается посредством сериализации, а не хранения объекта в памяти, поэтому я не знаю, как вы могли бы ссылаться на объект Producer, используя $ _CACHE [] или $ _SESSION []. Когда я разрабатывал на PHP, я действительно ничего не знал о многопоточности, поэтому я не стал с этим играть, но, думаю, вы можете в этом разобраться.

Использование бесконечных циклов потребует значительных вычислительных ресурсов - сначала я исчерпал бы все остальные варианты.

...