Нужно ли мне передавать HTTP-заголовки, чтобы сообщить браузеру, что мой сервер не будет немедленно закрывать соединение и отображать при получении HTML-кода? Есть ли что-нибудь необходимое для того, чтобы HTML-код постепенно отображался как flush ()?
Этот метод использовался для таких вещей, как чат, но я думаю об использовании его для приложения типа COMET.
Длительный опрос – это обычная техника, чтобы сделать что-то подобное; кратко изложить его, он работает следующим образом:
Клиент отправляет XHR на сервер.
Страница, запущенная на клиенте, получает эти данные и делает то, что она делает с ней.
Именно так Facebook реализует функцию чата .
В этой статье также устранены некоторые неправильные представления о длительном опросе, а также некоторые из преимуществ этого.
Клиент закроет соединение, когда он не получит никаких данных за определенное время. Этот тайм-аут не может зависеть от заголовков HTTP. Он специфичен для клиента и обычно устанавливается на 120 секунд IIRC.
Таким образом, все, что вам нужно сделать, – это регулярно отправлять небольшие объемы данных, чтобы избежать превышения таймаута.
Я думаю, что более надежное решение – это страница с таймером Javascript, который опросит сервер для новых данных. Сохранение ответа открытым – это не то, для чего был разработан протокол HTTP.
Я бы просто эхо / напечатал HTML, когда я пошел. Есть несколько разных способов, которыми вы можете иметь приостановку сценария перед отправкой следующего бита. Вам не нужно ничего делать с заголовками или любым специальным кодом, чтобы сообщить браузеру подождать. Пока ваш скрипт все еще работает, он будет отображать HTML-код, полученный из скрипта.
echo "<HTML><HEAD.../HEAD><BODY>"; while (running) { echo "printing html... </br>"; } echo "</BODY></HTML>"; //all done
Попробуйте навсегда фрейм (как в gmail)
Все эти техники – это просто хаки, http не предназначен для этого.
в конце вашего скрипта, используйте что-то вроде этого (если у вас есть буферизация вывода, поставив 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 килобайтах (имитируется) независимо от того, насколько быстро выполняется соединение пользователя и сервера.
В зависимости от того, что вы делаете, вы можете просто откликнуться по мере продолжения вашего сценария, после чего он отправит html в браузер, поскольку он будет эхом.
Я бы предложил вам исследовать реализацию таких функций с использованием Ajax, а не простого старого HTML. Это позволяет значительно повысить гибкость в плане архитектурного проектирования и пользовательского интерфейса