AJAX запросы для чата. Взгляд с другой стороны.

Аватара пользователя
AgentSIB
Администратор
Сообщения: 329
Зарегистрирован: 17 май 2010
Данную фитчу заметил уже давно (используется Вконтакте), но времени не было о ней написать. Этот прием полезен для написания AJAX чатов или для оперативного обновления какой либо информации на страницы. Как мне позже подсказал камрад Dmitry, данный фокус называется "long polling".

Начнем с примера классического AJAX запроса на получение данных.

Код: Выделить всё

var timeout = 5000;
function refreshData(){
   $.ajax({
      url:'/ajax.php',
      type:'post',
      data:{},
      dataType: 'text',
      success: function(data){
         // Делаем обработку data
         setTimeout(function(){refreshDate()},timeout);
      }
   });
}
$(function(){
   refreshData();
})


То есть при загрузке мы запускаем функцию. Она проводит AJAX запрос, вынимает какие то данные (например, появление новых сообщений) и запускает саму себя через пять секунд. Там самым актуальность данных составляет пять секунд. Можно конечно и уменьшить интервал, но для проектов с высокой нагрузкой это будет губительно.

А теперь взглянем с другой стороны. А что если это время ожидание будет не у пользователя, а на сервере? Можно ли отдавать данные по мере поступления? Оказывается можно.
Пример серверной части:

Код: Выделить всё

<?php
// Инициализация пользователя, загрузка других файлов
$sleep = isset($_POST['time'])?$_POST['time']:25;
$timeend = time()+$sleep;

$content = array()    
while(time()<$timeend && empty($content)){
   // Делаем любые запросы, которые повторяются каждую секунду. Если запрос вернул результат, заносим его в $content
   
   if
(!empty($content)) sleep(1);
}
echo json_encode($content); 


То есть при запуске скрипт будет выполняться либо 25 секунд, либо до того момента, пока не появиться контент. Как только контент появился - скрипт вернет данные. Получается, что если при первом запросе данные есть, скрипт вернет результат мгновенно.
Модернизируем часть на ява-скрипте.

Код: Выделить всё

var pt = 25; // Время работы скрипта можно регулировать и отсюда :)
function refreshDate(){
   $.ajax({
      url:'/ajax.php',
      type:'post',
      data:{time:pt},
      dataType: 'text',
      timeout:30,
      success: function(data){
         // Делаем обработку data
         refreshDate(); // Сразу же посылаем еще один запрос!
      }
   });
}
$(function(){
   setTimeout(function(){refreshDate()},2000) // первый запуск через 2 секунды после загрузки DOM
})


Плюс данного метода заключается в том, что данные отдаются сразу по мере поступления. Так же при обращению к скрипту обычно происходит коннект к базе, идентификация и инициализация пользователя, подгрузка других скриптов. В первом случае инициализация гарантировано будет происходить раз в 5 секунд, во втором же случае - примерно раз 25 секунд, однако это будет зависит от активности поступления данных. В любом случае - выигрыш очевиден.

Ссылка на статью: http://citylive.ru/blog/webcoders/210.html
Frustra fit per plura quod potest fieri per pauciora © Закон "Бритвы Оккама"

Вернуться в «PHP»