2011-01-27 5 views
0

Я пытаюсь собрать действительно простую страницу теста кометы. У меня есть главная страница клиента с идентификатором div #TextHistory. Javascript на этой странице должен создать открытое соединение с backend.php, которое использует javascript для обновления значения и сброса его обратно на страницу клиента. Я действительно не уверен, что я вообще делаю это правильно ... я основал его на How do I implement basic "Long Polling"?.Длинный опрос/комет php backend не очищает правильные данные - Newbie Question

Что я нахожу на странице клиента (FireFox), похоже, что backend.php ничего не возвращает и истекает через 10 секунд. Если я выберу петлю php в backend.php, она будет возвращать значение «DefaultData» и добавляет прямо в TextHistory DIV. Я чувствую, что я рядом, но что-то не так. Извините за странное форматирование здесь, похоже, что некоторые заголовки и теги php недопустимы.

стороны клиента:

$(document).ready(function() { 

    waitForMsg(); /* Start the inital request */ 


}); 


    function addmsg(type, msg){ 
     /* Simple helper to add a div. 
     type is the name of a CSS class (old/new/error). 
     msg is the contents of the div */ 
     $("#TextHistory").append(
      "<div class='msg "+ type +"'>New MSG: "+ msg +"</div>" 
     ); 
    } 

    function waitForMsg(){ 
     /* This requests the url "msgsrv.php" 
     When it complete (or errors)*/ 
     $.ajax({ 
      type: "GET", 
      url: "backend.php", 

      async: true, /* If set to non-async, browser shows page as "Loading.."*/ 
      cache: false, 
      timeout:50000, /* Timeout in ms */ 

      success: function(data){ /* called when request to barge.php completes */ 
       addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/ 
       setTimeout(
        'waitForMsg()', /* Request next message */ 
        1000 /* ..after 1 seconds */ 
       ); 
      }, 
      error: function(XMLHttpRequest, textStatus, errorThrown){ 
       addmsg("error", textStatus + " (" + errorThrown + ")"); 
       setTimeout(
        'waitForMsg()', /* Try again after.. */ 
        "15000"); /* milliseconds (15seconds) */ 
      }, 
     }); 
    }; 


    </script> 


</head> 

<body> 


    <div id="container"> 

    <div id="main"> 

    <h2>Text Scrolling Test</h2> 


     <div id="TextHistory"> 

     <p>First default line of text</p> 
     <p>Second default line of text</p> 

     </div> 

    </div> 

    </div> 



</body> 


</html> 

backend.php, который называется:

<---php start ---> 

session_start(); 

    header("Cache-Control: no-cache, must-revalidate"); 

    header("Expires: Mon, 26 Jul 2012 05:00:00 GMT"); 

flush(); 

<---php end ---> 

то по умолчанию HTML доктайпа, головы, мета, JQuery включают,

затем в организме:

<div id="LastMsg">DefaultData</div> 

<---PHP Start ---> 

    $OutputMsg = "Initial"; 


    while (true) { 

    $OutputMsg .= "Something."; 

    echo " 

     <script type=\"text/javascript\"> 
     $('#LastMsg').html(\"<p>$OutputMsg</p>\"); 
     </script> 

    "; 



     flush(); // Ensure the Javascript tag is written out immediately 
     sleep(1); 
    } 



    <---PHP END ---> 
+0

Возможно ли задействовать javascript/jQuery на сервере? Кроме того ... это только для теста, поэтому я могу получить представление о том, как работает комета, это не приводит к действию для реального мира. Я ценю комментарии, советующие не делать этого. –

ответ

1

Вы должны использовать flush() с буферизацией вывода. PHP делает некоторые странные вещи внутренне, поэтому вы обычно должны использовать оба.

ob_start();

в то время (правда) {

если ($ newcontent) { эхо 'мое новое содержание'; ob_flush(); flush(); }

sleep (1); }

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

0

Я не думаю, что вы не должны делать длинный опрос в PHP, в первую очередь, because it is not the right tool for the job (см. № 1). PHP не имеет нить-модели (Share-nothing Architecture) и будет плохо масштабироваться.

Для этого вы можете использовать pusherapp (бесплатно для небольших приложений), и это будет более эффективным, простым в использовании.