Ответ IFrame Comet не содержит данных - PullRequest
0 голосов
/ 26 июля 2010

Я экспериментирую с Comet, и я застрял в реализации этого через скрытый IFrame ("навсегда фрейм".

Это мой index.html:

<!DOCTYPE HTML>
<html>
  <head>
    <script type="text/javascript">
    cometResponse = function() {
        var debugOut = document.getElementById('debugOutput');
        return function(response) {
            debugOut.innerHTML = response.number; 
        }
    }
    </script>
  </head>
  <body>
    <div id="debugOutput"></div>
    <iframe src="comet.php"></iframe>
  </body>
</html>

Иэто файл comet.php:

<?php
set_time_limit(0);
header('Content-Type: text/html');
header('Cache-Control: no-cache, must-revalidate'); 
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Transfer-Encoding: chunked');
flush();
ob_flush();

$response = '<script type="text/javascript">
parent.cometResponse({
    number: %1$d
});
</script>';

for ($i = 0; $i < 2; $i++) {
    sleep(1);
    $data = sprintf($response, $i);
    $output = strtoupper(dechex(strlen($data)))."\r\n".$data."\r\n";
    echo $output;
    flush();
    ob_flush();
}
echo "0\r\n\r\n";

После загрузки страницы браузер, похоже, «ждет» ответа. Через несколько секунд Firebug показывает пустой ответ с такими заголовками ответа:

HTTP/1.1 200 OK
Date: Mon, 26 Jul 2010 09:34:04 GMT
Server: Apache/2.2.14 (Win32) PHP/5.2.12
X-Powered-By: PHP/5.2.12
Cache-Control: no-cache, must-revalidate
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Transfer-Encoding: chunked
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: text/html;charset=ISO-8859-2

Поскольку ответ обрабатывается как пустой, тег, который должен быть в ответе, также не выполняется.

Однако, если я удалю заголовок «Transfer-Encoding: chunked», содержимое отправляется в браузер правильно, но все в одном большом фрагменте в конце скрипта, как и ожидалось.

Я просто не могу найти, что здесь не так.

Ответы [ 2 ]

0 голосов
/ 05 октября 2012

Это может помочь кому-то еще, вот как я решил это:

<?php
header('Content-Encoding: chunked');
header('Transfer-Encoding: chunked');
header('Content-Type: text/html');
header('Connection: keep-alive');
header('Cache-Control: no-cache, must-revalidate');
flush();
set_time_limit(0);
function chunk($data) {
    echo sprintf("%x\r\n%s\r\n", strlen($data), $data);
    flush();
    ob_flush();
}
// Code to output data here.
// The following loop is an example.
for($i = 0; $i < 5; $i++) {
    chunk('<script type="text/javascript">window.top.test();</script>');
    sleep(1);
}
chunk('');
?>

Требуется пустой кусок в конце вывода.

Тогда вы можете просто вывести данные с помощьювызывая функцию chunk так:

chunk('data');
0 голосов
/ 26 июля 2010

Два предположения:

  1. Кодировка содержимого: gzip

    Может быть, mod_gzip работает неправильно?Вы пробовали использовать другой хост?

  2. Может быть, Firefox игнорирует код, если он не находится в пределах
...