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

Ответить
Аватара пользователя
AgentSIB
Сообщения: 329
Зарегистрирован: 17.05.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 © Закон "Бритвы Оккама"

Ответить