Подтвердить что ты не робот

Как отображать HTML в браузере постепенно в течение длительного периода времени?

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

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

4b9b3361

Ответ 1

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

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

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

  • Вернитесь к 1)

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

echo "<HTML><HEAD.../HEAD><BODY>";
while (running)
{
    echo "printing html... </br>";
}
echo "</BODY></HTML>";  //all done

Ответ 5

Попробуйте использовать кадр (как в gmail)

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

Ответ 6

в конце вашего script, используйте что-то вроде этого (при условии, что у вас есть буферизация вывода, поставив 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

}

?>

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

Ответ 7

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

Ответ 8

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