PHP: вывод данных до и после сна ()? - PullRequest
4 голосов
/ 10 сентября 2010

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

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

Ответы [ 6 ]

5 голосов
/ 10 сентября 2010

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

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

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

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

3 голосов
/ 10 сентября 2010
ob_start();
echo "one";
ob_flush();
sleep(10);
ob_start();
echo "two";

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

1 голос
/ 20 января 2012

Я использую функцию 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);
1 голос
/ 10 сентября 2010

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

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

0 голосов
/ 10 сентября 2010

Не может, потому что браузер ожидает полной версии документа, потому что какой движок браузера разбирает половину страницы XHTML и после этого (как отрендерить половину XML?) Читает другую часть.

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

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

0 голосов
/ 10 сентября 2010

С ob_flush () - но это очистит содержимое буфера.Вы не можете ввести задержку в буфер, она просто так не работает.

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

...