PHP: вывод данных до и после сна ()?

Это просто для того, чтобы узнать больше о буферизации вывода и больше ничего. Что я хочу сделать, это передать строку в браузер, поспать 10 секунд, а затем повторить что-то еще. Обычно браузер подождал бы полные 10 секунд, а затем опубликовал весь результат, как мне это остановить? Пример:

ob_start();
echo "one";
sleep(10);
echo "two";

6 ответов

Решение

Ответ faileN в теории верен. Без ob_flush() данные будут оставаться в буфере PHP и не поступят в браузер, пока буфер не будет неявно очищен в конце запроса.

Причина, по которой он все еще не работает, заключается в том, что браузеры также содержат буферы. Данные теперь отправляются корректно, но браузер ждет после получения "единицы", прежде чем он фактически начинает рендеринг. В противном случае при медленных соединениях рендеринг страницы будет очень-очень медленным.

Обходной путь (чтобы проиллюстрировать, что он работает правильно) - это, конечно, отправить сразу много данных (может быть, какой-нибудь огромный html-комментарий или что-то в этом роде) или использовать такой инструмент, как curl в командной строке.

Если вы хотите использовать этот цикл отправки / ожидания для некоторого пользовательского интерфейса обновления статуса на клиенте, вам нужно будет найти другой способ (например, long-polling и AJAX)

ob_start();
echo "one";
ob_flush();
sleep(10);
ob_start();
echo "two";

Это то, что вы имели ввиду?

Если я правильно понимаю, вы пытаетесь напечатать часть ответа на экране, подождите 10 секунд и выведите остальное, все это при загрузке страницы. Это потребует некоторых сценариев на стороне клиента для этого, так как PHP выдаст весь ответ в конце.

Я думаю, что комбинация ob_flush и flush может сработать, но буферизация не обрабатывается одинаково в каждом браузере (например, IE).

Я использую JavaScript setTimeOut() Функция для этого. Работает нормально. Кроме того, вы можете использовать <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?) Читает другую часть.

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

Я скучаю, понимаю этот вопрос, потому что я никогда не задумываюсь о введении 10-секундного буфера строки.

Другие вопросы по тегам