Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中禁用输出缓冲_Php_Apache_Xampp_Buffering - Fatal编程技术网

在PHP中禁用输出缓冲

在PHP中禁用输出缓冲,php,apache,xampp,buffering,Php,Apache,Xampp,Buffering,我有一个用于任务的对象,在_deconstruct()上,它意味着在页面的其余部分已经加载之后运行一些较长的清理任务。不幸的是,它会缓冲输出,直到任务完成后才会发送(任务中没有打印任何内容) 我已经通读并尝试了那里所有的建议。显然,我已经尝试在php.ini中禁用输出缓冲。我已经禁用了deflate_模块,zlib压缩已关闭,没有mod_gzip。调用flush()或ob_flush()没有效果,启用隐式\u flush也没有效果 我只是在WindowsServer2008R2下运行XAMPP(

我有一个用于任务的对象,在_deconstruct()上,它意味着在页面的其余部分已经加载之后运行一些较长的清理任务。不幸的是,它会缓冲输出,直到任务完成后才会发送(任务中没有打印任何内容)

我已经通读并尝试了那里所有的建议。显然,我已经尝试在php.ini中禁用输出缓冲。我已经禁用了deflate_模块,zlib压缩已关闭,没有mod_gzip。调用flush()或ob_flush()没有效果,启用隐式\u flush也没有效果

我只是在WindowsServer2008R2下运行XAMPP(目前是Apache2.2.17,PHP5.3.4)。PHP正在作为一个模块运行

是的,我可以设置一些AJAX小技巧来运行任务管理器,甚至可以设置一个调度任务来运行这个特定任务,但是输出缓冲在其他地方也是一个问题。我只是希望它有时会消失

从一个类似的线索中,有人建议看看下面的方法:

<?php
while (TRUE)
{
    echo 'x';
    flush();
    sleep(1);
}
?>

正如预期的那样,页面在达到最大执行时间之前不会显示任何内容,此时它会刷新缓冲区


这已经变得非常令人沮丧。有人知道是什么原因导致它缓冲吗?

您只发送了少量数据。浏览器有自己的缓冲区,缓冲区可以基于一定数量的字节、接收元素的字节或其他内容

简言之,你对此无能为力。缓冲发生在客户端,而不是服务器端。您可以尝试在
x
s之前发送更多数据


您可以通过数据包嗅探服务器和浏览器之间的连接来证明这一点,包括或类似的连接。

hmmm,我在其他地方使用了一小段代码,它按预期工作

https://stackoverflow.com/a/9728519/632951

<?php
echo str_repeat('fillerbytes',20*1024/strlen('fillerbytes'));
echo '<body style="font-size:6px;font-family:arial;">';
echo str_repeat('<br>',2);
    for($i=1; $i<=5000; $i++){
        echo $i . ' ';
        ob_flush();
        flush();
        usleep(2000); // 2 ms each = 10s total
    }
?>
https://stackoverflow.com/a/9728519/632951
看着我的服务器计数到5000


(在freehostingeu.com等一些免费主机上不起作用。)

您能否确认输出仍在缓冲,而浏览器只是不显示任何内容(例如,IE在收到一定数量的字节之前不会显示任何内容)?此函数是否返回0?如果它有助于我尝试多个浏览器,您是否可以尝试此功能,所以我想这不是问题所在。当然,在实际测试时,结果证明它是正确的。ob_get_level()返回0,因为这不是问题所在。我想说的是,我之前发送了相当多的数据,但后来将其更改为for($i=0;$iIE就是因为这个而出名的。我在刷新之前发送了大约1000个空格来欺骗IE。因为HTML合并了空格,这并不重要。是的,这是有效的。不幸的是,这只是因为它发送的数据远远超过了我想要发送的数据。将迭代之间的时间更改为1s而不是.001s会导致不需要的行为返回。这是祝你愉快。我认为这是因为使用了ob_flush();而不是flush();这是因为发送的数据量,而不是ob_flush()。即使添加ob_flush(),原始示例也会失败,或者当将迭代之间的时间更改为1s而不是当前的千分之一秒时,此操作失败。@TimWick,请注意,只有当最终用户不是缓冲响应的中介时,流式传输才有效。另请参阅@TimWickstrom,您使用哪家托管公司?