Это чисто для получения дополнительной информации о буферизации вывода и ничего более. То, что я хочу сделать, это повторить строку в браузере, спящий 10 секунд, а затем повторить что-то еще. Обычно браузер будет ждать полные 10 секунд, а затем опубликовать весь результат, как я могу это остановить? Пример:
ob_start(); echo "one"; sleep(10); echo "two";
Ответ faileN верен в теории. Без ob_flush()
данные останутся в буфере PHP и не появятся в браузере до тех пор, пока буфер не будет скрыт в конце запроса.
Причина, по которой он все еще не работает, заключается в том, что браузеры также содержат буферы. Теперь данные отправляются правильно, но браузер ждет после получения «одного», прежде чем он начнет рендеринг. В противном случае, при медленных соединениях, рендеринг страниц будет действительно, очень медленным.
Обходной путь (чтобы проиллюстрировать, что он работает правильно) – это, конечно, отправить сразу несколько данных (может быть, какой-то огромный html-комментарий или что-то еще) или использовать такой инструмент, как завиток в командной строке.
Если вы хотите использовать этот цикл отправки / спящего режима для некоторого пользовательского интерфейса обновления состояния на клиенте, вам придется найти другой способ (например, длительный опрос и AJAX)
ob_start(); echo "one"; ob_flush(); sleep(10); ob_start(); echo "two";
Это то, что вы имели ввиду?
Если я правильно понял, вы пытаетесь распечатать часть ответа на экране, подождать 10 секунд и вывести остальное, все это, когда страница загружается. Для этого потребуется несколько сценариев на стороне клиента, поскольку PHP выведет весь ответ в конце.
Я думаю, что комбинация ob_flush и flush может работать, но буферизация не обрабатывается одинаково в каждом браузере (например, IE).
Для этого я использую функцию setTimeOut()
JavaScript. Он работает нормально. Кроме того, вы можете использовать <noscript>
для браузеров, где JavaScript отключен.
$txt = setPageHeader(); // a PHP function that returns a new DOCTYPE // plus <html><head>(...)</head>, // plus an opening <body> tag echo 'All things were completed. You should be redirected in about 3 seconds'; $txt .= '<script type="text/javascript">'; $txt = $txt.'function Rediriger() {document.location.replace(\'http://yoursite.com/yourpage.php?anticaching='.rand().'\');}'; $txt .= 'setTimeout (\'Rediriger()\', \'3000\')'; $txt .= '</script>'; $txt .= '<noscript><a href="http://yoursite.com/yourpage.php?anticaching='.rand().'">Javascript is disabled in your browser. Click here for being redirected.</a></noscript>'; $txt .= '</body></html>'; echo ($txt);
С ob_flush () – но это очистит содержимое буфера. Вы не можете вводить задержку в буфер, это просто не работает.
Вы либо сразу выгружаете весь буфер, либо сохраняете весь буфер для последующего использования.
Не может, потому что браузер ждет полную версию документа, потому что какой браузер движет половину страницы XHTML и после этого (как визуализировать половину XML?), Читает другую часть.
Вы должны подумать о отправке заголовка раньше, чтобы сообщить браузеру, когда данные двоичных данных были отшлифованы, а затем браузер получит данные после recv и, возможно, выберет эти данные на экране немедленно.
Я не понимаю, что этот вопрос, потому что я никогда не думаю о том, чтобы вводить в буфер буфера 10 с.