Как стать автором
Обновить

XMLHttpRequest.abort() или как правильно убить запрос?

Здравствуйте!
Разбираюсь с Comet технологиями. Возникла следующая проблема, решение которой я так и не смог найти. Итак, все по порядку:

Имеем сервер:
  • PHP 5.3.13
  • Apache/2.2.22 (Unix)

Создаем XmlHttpRequest соединение на стороне клиента:
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

xml = getXMLHttpRequest();
xml.onreadystatechange = function(){
  if(xml.readyState == 3){
    console.log(xml.responseText);
  }
};
xml.open('POST', "/events/allEvents", true);
xml.send(null);


На стороне сервера ловим и удерживаем соединение следующим образом:
set_time_limit(0);
while(@ob_end_flush()){}ob_implicit_flush(1);
for($i=0; $i<100; $i++){
  // Что-то делаем...
  sleep(1);
}


Итак, а теперь о проблеме: хочется этим соединением управлять, а если быть точным, хочется его обрывать по таймеру или по каким-то другим событиям. Убиваю XMLHttpRequest:
xml.abort()


Запрос действительно убивается, но соединение остается. Поэтому, приходится ждать, пока на сервере закончится цикл и только после этого возможно совершать другие действия (перезагрузить или перейти на другую страницу и т.д.). Вот и вопрос: как правильно убить данное соединение?
P.S. Конечно, лучше было бы использовать websocket или IFrame, но хотелось бы разобраться полностью в данной технологии.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.