我尝试过多次尝试使用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();
我想让它回应它正在做的事情,然后运行该函数,然后回显其他东西,然后再做另一个函数。我希望在浏览器上实时刷新和回显所有缓冲区。
答案 0 :(得分:41)
这里的想法是禁用输出缓冲,而不是启用它。顾名思义,输出缓冲会将输出保存到内存中并在脚本末尾显示,或者在明确要求时显示。
话虽如此,您不必为每个输出明确刷新。在显示任何输出之前使用以下内容,然后每次回显时都不必费心冲洗:
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,每秒显示一次。
答案 1 :(得分:4)
我只是想快速记下我在2016年观察到的不同建议的内容:
netcoder 和 David 提供的上述代码在以下浏览器中适用于我:
它似乎不适用于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
通过所有浏览器似乎有更好的当前支持:
工作实施似乎每年都在变化,所以我想提供一份我目前发现自己工作的更新。
答案 2 :(得分:2)
这个问题似乎在Google搜索中出现了很多,所以我想更新它。 它是2014年9月.....
@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);
}
答案 3 :(得分:1)
请注意,您可能需要在网络服务器(apache或nginx)上禁用gzip压缩。
这是我的问题。
答案 4 :(得分:0)
我遇到了同样的问题,但是用户指出了我正确的方向,我使用了“for”循环来解决这个特定于浏览器的问题:
for($i = 0; $i < 5000; $i++)
{
echo ' ';
}
有关详细信息,请与Outputting exec() ping result progressively相关联。
答案 5 :(得分:0)
现在可以使用(至少在php 5.5上)
ob_end_flush();
while(stuff){
..stuff...
echo('yo');
flush();
}
无需睡觉或其他任何事情
答案 6 :(得分:0)
typedef __nullable id(^AWSContinuationBlock)(AWSTask<ResultType> *task);
答案 7 :(得分:0)
2021 年更新
我遇到了同样的问题,我基本上使用了 Imanuel Habekotte 的解决方案
在我的 .htaccess 文件中;
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .*/my_file_name.php$ no-gzip dont-vary
然后在我的php代码文件(my_file_name.php)中;
header('Content-Type: text/octet-stream; charset=utf-8');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.
ini_set('max_execution_time', 0);
@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();
ob_implicit_flush(true);
/**
Send a partial message
*/
function send_message($id, $message, $progress)
{
$d = array('message' => $message , 'progress' => $progress);
echo json_encode($d) . PHP_EOL;
echo str_pad('',8192)."\n";
//PUSH THE data out by all FORCE POSSIBLE
ob_flush();
flush();
}