Comet(Long polling) — php + jquery?

Не могли бы вкратце объяснить, сопровождая примерами, работу comet(long polling)-приложения при помощи jquery и php? Как конкретно создать ajax-соединение, которое длится некое количество времени(за счет чего)?
  • Вопрос задан
  • 14234 просмотра
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
js создает соединение (в опциях для ajax запроса выставляется таймаут побольше)
php принимает его и смотри что можно послать. И ждет... ждет пока не появятся данные которые можно послать.
Как только данные появляются (скажем скрипт с какой-то задержкой читает данные из базы или из очереди) то он отправляет эти данные и обрывает соединение.
js скрипт принимает данные, отдает данные на обработку и создает новое соединение.... и так до бесконечности.

По сути просто вместо того что бы опрашивать сервер раз в секунду, создается соединение, живущее только до получения данных. После получения данных соединение закрывается. После закрытия соединения (не важно пришли данные или произошла ошибка/разрыв по таймаут) так же создается новое. На практике таймаут выставляют секунд в 20-30 что бы избежать возможных проблем.
Ответ написан
@arcanrun Автор вопроса
У меня не получается сразу получать новые данные - они приходят только после нового выполнения функции getmess, которая выполняется по истечению таймера, в чем может быть ошибка?

function getmess(){
$.ajax({
url:"get_mess.php",
type:"POST",
data:{"id":id},
cahce:false,
timeout:30000,
async:true,
success:function(result){
$("#response").html(result);
setTimeout('getmess()',10000);
}
});
}

на сервере:

while(true){
$a=$_POST["id"];
$find_mess=(mysql_query("SELECT * FROM saymon WHERE id> '$a' "));
if (mysql_num_rows($find_mess)) {
while($row=mysql_fetch_array($find_mess)){
echo $row['mess']."";
}

flush();
exit;
}

sleep(5);
}
mysql_close();
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы