Какой альтернативный способ обновления страницы новыми записями, когда они вставляются в таблицу автоматически, без использования jquery / ajax - PullRequest
3 голосов
/ 05 апреля 2011

Я написал небольшую систему чата с использованием jquery, php и mysql; Тем не менее, я ищу какую-то технологию, которая будет обновлять, только если новая запись вставлена ​​в строку. Я чувствую, что использование jquery ajax-вызовов каждую секунду для получения новых записей на моем сервере действительно излишне и напряженно.

Ответы [ 5 ]

3 голосов
/ 05 апреля 2011

Вы ищете решение Comet: http://en.wikipedia.org/wiki/Comet_%28programming%29

Идея, как отметил pdr, заключается в том, чтобы javascript постоянно открывал асинхронный запрос к серверу.Сервер держит его открытым, но ничего не отправляет, пока не определит, что есть что отправить.Запрос будет на тайм-ауте со стороны javascript через 10-20 секунд, после чего он должен повторно открыть соединение.

При этом используется модель на основе «подписчика», при которой сервер отправляет сообщение чата иличто вы, всем клиентам, которые подписаны, все сразу.Это экономит много запросов к базе данных, так как сервер запрашивает запросы, а не отдельные клиенты.

2 голосов
/ 05 апреля 2011

Я знаю несколько путей, по которым вы можете пойти.

  1. Длинный опрос. Здесь браузер открывает соединение с сервером и ничего не делает, пока сервер не ответит. После того как сервер ответит или истечет время ожидания (отправит пустой ответ браузеру), будет сделан новый запрос на длинный опрос.

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

  2. Веб-сокеты. Опять же, вам понадобится сервер, который может обрабатывать запросы, не создавая новый поток при каждом запросе. С помощью веб-сокетов соединение между клиентом и сервером остается открытым, и, в отличие от длинного опроса, время не истекает. Однако это пока не поддерживается.

Я настоятельно рекомендую проверить http://socket.io/

2 голосов
/ 05 апреля 2011

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

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

set_time_limit(0);

while (TRUE) {

   $db->query('SELECT `message` FROM `messages` WHERE `new` = TRUE');

   if ($db) {
       echo json_encode($db->results());
       exit;
   }
   sleep(1);
}

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

Это намного эффективнее, чем непрерывный опрос обновлений с использованием XHR.

Удостоверьтесь, что вы проводите много исследований, потому что я считаю, что Apache подумает, что что-то не так, если скрипт PHP не остановился примерно через 30 секунд. :)

0 голосов
/ 05 апреля 2011

Со стандартным HTML / CSS / JS это практически единственный способ, поскольку браузер может выполнять запросы к серверу, а не наоборот. Вызов AJAX не должен быть очень большим. Система чата, по определению, потребует много попаданий на сервер.

0 голосов
/ 05 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...