Как отображать HTML в браузер постепенно в течение длительного периода времени? - PullRequest
12 голосов
/ 03 июня 2009

Нужно ли мне возвращать какие-либо HTTP-заголовки, чтобы сообщить браузеру, что мой сервер не будет немедленно закрывать соединение, и отобразить его при получении HTML-кода? Есть ли что-нибудь необходимое для того, чтобы HTML-код постепенно отображался как flush ()?

Этот метод использовался для таких вещей, как чат, но я думаю об использовании его для приложения типа COMET.

Ответы [ 8 ]

14 голосов
/ 03 июня 2009

Длинный опрос - это обычная техника для выполнения чего-то подобного; Вкратце, это работает следующим образом:

  1. Клиент отправляет XHR на сервер.

    • Если данные готовы, сервер немедленно возвращает их.
    • Если нет, сервер сохраняет соединение открытым до тех пор, пока данные не станут доступными, а затем возвращает это.
    • Если время ожидания запроса истекло, вернитесь к 1).
  2. Страница, запущенная на клиенте, получает эти данные и делает с ними то же самое.

  3. Вернуться к 1)

Так Facebook реализует функцию чата .

Эта статья также проясняет некоторые ошибочные представления о длинном опросе и детализирует некоторые преимущества этого.

2 голосов
/ 03 июня 2009

Клиент закроет соединение, если не получит никаких данных в течение определенного времени. Этот тайм-аут не может зависеть от заголовков HTTP. Это зависит от клиента и обычно устанавливается на 120 секунд IIRC.

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

1 голос
/ 03 июня 2009

в конце вашего скрипта используйте что-то вроде этого (при условии, что у вас включена буферизация вывода, поместив ob_start () вверху вашей страницы

<?php

set_time_limit(0); // Stop PHP from closing script after 30 seconds

ob_start();

echo str_pad('', 1024 * 1024, 'x'); // Dummy 1 megabyte string

$buffer = ob_get_clean();

while (isset($buffer[0])) {

$send = substr($buffer, 0, 1024 * 30); // Get 30kbs bytes from buffer :D
$buffer = substr($buffer, 1024 * 30); // Shorten buffer

echo $send; // Send buffer
echo '<br />'; // forces browser to reload contents some how :P

ob_flush(); // Flush output to browser
flush(); 

sleep(1); // Sleep for 1 second

}

?>

Этот сценарий в основном выводит 1 мегабайт текста на 30 КБ (имитируется) независимо от того, насколько быстрым является соединение пользователя и сервера.

1 голос
/ 03 июня 2009

Попробуй навсегда фрейм (как в gmail)

Все эти техники просто взломаны, http не предназначен для этого.

1 голос
/ 03 июня 2009

Я бы просто повторил / распечатал HTML на ходу. Есть несколько разных способов сделать паузу в скрипте перед отправкой следующего бита. Вам не нужно ничего делать с заголовками или специальным кодом, чтобы браузер ждал. Пока ваш скрипт еще работает, он будет отображать HTML, полученный от скрипта.

echo "<HTML><HEAD.../HEAD><BODY>";
while (running)
{
    echo "printing html... </br>";
}
echo "</BODY></HTML>";  //all done
1 голос
/ 03 июня 2009

Я думаю, что более надежное решение - это страница с таймером Javascript, который опрашивает сервер на наличие новых данных. Сохранение ответа открытым - это не то, для чего был разработан протокол HTTP.

0 голосов
/ 03 июня 2009

Я бы посоветовал вам изучить реализацию такой функциональности с использованием Ajax, а не простого старого HTML. Это дает вам гораздо большую гибкость с точки зрения архитектурного дизайна и пользовательского интерфейса

0 голосов
/ 03 июня 2009

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

...