буфер — PHP Flush / ob_flush не работает

Я попробовал несколько попыток заставить мой флеш и ob_flush работать. Я попытался установить ini, чтобы разрешить буферизацию, я попытался использовать несколько различных функций, которые я нашел онлайн для буферизации вывода, и ни одна из них вообще не работает. Скрипт хочет подождать, пока он полностью не завершится, пока не отобразится вывод. Вот сценарий у меня до сих пор

 ob_start();

//Login User
echo 'Logging in to user<br>';
ob_flush();
flush();
$ch = curl_init("http://www.mysite.com/login/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=$user&pass=$pass");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/$cookie");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/$cookie");
$output = curl_exec($ch);
curl_close($ch);
ob_flush();
flush();

//Update Status
echo 'Updating Status<br>';
ob_flush();
flush();
$ch = curl_init("http://www.mysite.com/update/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "status=$status");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/$cookie");
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/$cookie");
$output = curl_exec($ch);
curl_close($ch);
ob_flush();
flush();

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

9

Решение

Идея здесь заключается в запрещать буферизация вывода, не включайте его. Как следует из названия, буферизация вывода сохранит выходные данные в память и отобразит их в конце скрипта или при явном запросе.

При этом вам не нужно явно сбрасывать значения для каждого вывода. Используйте следующее, прежде чем отображать какие-либо выходные данные, и тогда вам не придется беспокоиться о сбросе каждый раз, когда вы что-то выводите:

ob_implicit_flush(true);
ob_end_flush();

За пример:

ob_implicit_flush(true);
ob_end_flush();

for ($i=0; $i<5; $i++) {
echo $i.'<br>';
sleep(1);
}

Будет выводить от 0 до 4, каждый из которых будет отображаться каждую секунду.

39

Другие решения

Я просто хотел написать короткую заметку о том, что я наблюдал, в 2016 году, из различных предложенных подходов:

Вышеуказанные коды предлагаются netcoder а также Дэвид у меня работают в следующих браузерах:

  • Хром
  • опера

Кажется, он не работает в Firefox, Safari или IE 10-11.

Я также проверил альтернативный код:

<?php

if (ob_get_level() == 0) ob_start();
for ($i = 0; $i<10; $i++){

echo "<br> Line to show.";
echo str_pad('',4096)."\n";

ob_flush();
flush();
sleep(2);
}

echo "Done.";

ob_end_flush();
?>

Который можно найти здесь: http://php.net/manual/en/function.flush.php#54841

Который, кажется, имеет лучшую текущую поддержку во всех браузерах:

  • Хром
  • Fire Fox
  • опера
  • Сафари
  • IE 10
  • IE 11

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

4

Этот вопрос, кажется, часто появляется в поиске Google, поэтому я хотел обновить его.
Это сентябрь 2014 года …..

Ответ @Netcoder работает, но Chrome иногда все равно выводит все сразу.

Чтобы это исправить, просто добавили ob_flush(), and flush() в коде он будет выводиться через каждую секунду.

Пример:

ob_implicit_flush(true);
ob_end_flush();

for ($i=0; $i<5; $i++) {
echo $i.'<br>';
ob_flush();
flush();
sleep(1);
}
2

Обратите внимание, что вам может потребоваться отключить сжатие gzip на вашем веб-сервере (apache или nginx).

Это была моя проблема.

1

У меня была та же проблема, но пользователь указал мне правильное направление, я использовал цикл «for» для решения этой проблемы браузера:

for($i = 0; $i < 5000; $i++)
{
echo ' ';
}

Относится к Вывод результата exec () ping постепенно Больше подробностей.

0

это работает сейчас (по крайней мере на PHP 5.5)

ob_end_flush();
while(stuff){
..stuff...
echo('yo');
flush();
}

не нужно спать или что-то еще

0
<?php
header('Content-Type: text/html; charset=utf-8');

// I think maybe you can set output_buffering using ini_set here, but I'm not sure.
// It didn't work for me the first time at least, but now it does sometimes...
// So I set output_buffering to Off in my php.ini,
// which normally, on Linux, you can find at the following location: /etc/php5/apache2/php.ini

@ini_set('output_buffering','Off');
@ini_set('zlib.output_compression',0);
@ini_set('implicit_flush',1);
@ob_end_clean();
set_time_limit(0);
ob_start();

//echo str_repeat('        ',1024*8); //<-- For some reason it now even works without this, in Firefox at least?
?>
<!DOCTYPE html>
<html>
<head>
<title>PHP Flushing</title>
</head>
<body>
<h1>Flushing the webpage in real-time using PHP.</h1>
<?php
ob_flush();
flush();

//Note: ob_flush comes first, then you call flush. I did this wrong in one of my own scripts previously.
for($i=0; $i<5; $i++) {
echo $i.'<br>';
ob_flush();
flush();
sleep(1);
}
?>
</body>
</html>
0