在PHP中禁用输出缓冲

时间:2012-03-15 20:42:05

标签: php apache xampp buffering

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

我已阅读http://www.php.net/flush并尝试了所有建议。显然我已经尝试在php.ini中禁用output_buffering。我已禁用deflate_module,zlib压缩已关闭,没有mod_gzip。调用flush()或ob_flush()没有效果,也没有启用implicit_flush。

我刚刚在Windows Server 2008 R2下运行XAMPP(目前是apache 2.2.17,php 5.3.4)。 PHP正在作为模块运行。

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

在类似的帖子中,有人建议看看以下内容:

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

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

这已经变得非常令人沮丧。任何人都有什么想法可能导致它缓冲?

2 个答案:

答案 0 :(得分:4)

您只发送少量数据。浏览器有自己的缓冲区,可以基于多个字节,已经接收到元素,或者其他东西。

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

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

答案 1 :(得分:4)

嗯,有趣的是抓住了我在其他地方使用的代码片段,它按预期工作......

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
    }
?>

观察我的服务器数量为5000 http://atwebresults.com/texttest/new.php

(对freehostingeu.com等免费主机不起作用。)