Как отображать HTML в браузере постепенно в течение длительного периода времени?
Нужно ли мне передавать HTTP-заголовки, чтобы сообщить браузеру, что мой сервер не будет немедленно закрывать соединение и отображать при получении HTML-кода? Есть ли что-нибудь, что необходимо для того, чтобы HTML-код постепенно отображался как flush()?
Этот метод использовался для таких вещей, как чат, но я думаю об использовании его для приложения типа COMET.
Ответы
Ответ 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. Это позволяет значительно повысить гибкость в плане архитектурного дизайна и пользовательского интерфейса.