Я попробовал несколько попыток заставить мой флеш и 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();
Я хочу, чтобы он повторил то, что он делает, затем запустил функцию, затем повторил что-то еще, затем сделал другую функцию. Я хочу, чтобы все буферы очищались и отображались в реальном времени в браузере.
Идея здесь заключается в запрещать буферизация вывода, не включайте его. Как следует из названия, буферизация вывода сохранит выходные данные в память и отобразит их в конце скрипта или при явном запросе.
При этом вам не нужно явно сбрасывать значения для каждого вывода. Используйте следующее, прежде чем отображать какие-либо выходные данные, и тогда вам не придется беспокоиться о сбросе каждый раз, когда вы что-то выводите:
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, каждый из которых будет отображаться каждую секунду.
Я просто хотел написать короткую заметку о том, что я наблюдал, в 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
Который, кажется, имеет лучшую текущую поддержку во всех браузерах:
Рабочие реализации, похоже, меняются из года в год, поэтому я хотел предложить обновление того, над чем я работал в данный момент.
Этот вопрос, кажется, часто появляется в поиске 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);
}
Обратите внимание, что вам может потребоваться отключить сжатие gzip на вашем веб-сервере (apache или nginx).
Это была моя проблема.
У меня была та же проблема, но пользователь указал мне правильное направление, я использовал цикл «for» для решения этой проблемы браузера:
for($i = 0; $i < 5000; $i++)
{
echo ' ';
}
Относится к Вывод результата exec () ping постепенно Больше подробностей.
это работает сейчас (по крайней мере на PHP 5.5)
ob_end_flush();
while(stuff){
..stuff...
echo('yo');
flush();
}
не нужно спать или что-то еще
<?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>