Длинный опрос / кометный PHP-сервер не сбрасывает правильные данные - PullRequest
0 голосов
/ 28 января 2011

Я пытаюсь собрать действительно простую страницу кометного теста.У меня есть главная страница клиента с идентификатором div #TextHistory.Javascript на этой странице должен создать открытое соединение с backend.php, который использует javascript для обновления значения и сброса его обратно на страницу клиента.Я действительно не уверен, что делаю все правильно ... я основал это на Как мне реализовать базовый "длинный опрос"? .

Что яНаходится на странице клиента (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 doctype, head, meta, jquery include,

затем в теле:

 <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 --->

Ответы [ 2 ]

1 голос
/ 28 января 2011

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

ob_start ();

while (true) {

if ($ newcontent) { эхо «мой новый контент»; ob_flush (); промывать(); }

сон (1); }

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

0 голосов
/ 28 января 2011

Я не думаю, что в первую очередь вам не следует делать длинные опросы в PHP, , потому что это не правильный инструмент для работы (см. # 1). PHP не имеет потоковой модели ( Архитектура без общего доступа ) и будет плохо масштабироваться.

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

...