Iir*_*rvi 6 linux php apache-2.2
我在 Linux Web 服务器上遇到了 PHP 输出缓冲区刷新的问题。输出缓冲区得到正确维护,所有正确的数据都在我的代码中推送到它,但通常的刷新机制不会将其刷新到浏览器。我已经尝试了这里发布的所有内容:http : //php.net/manual/en/function.flush.php但到目前为止没有成功。
我从 php.net 得到了一个小脚本来测试它:
<?php
ob_start();
for($i=0;$i<70;$i++)
{
echo 'printing...<br />';
ob_get_flush();
flush();
usleep(300000);
}
?>
Run Code Online (Sandbox Code Playgroud)
这应该向浏览器打印“正在打印...”70 次,每三秒一行。这在我的其他基于 Windows 的测试环境(仍然使用 apache、XAMPP 包)上运行良好,但在我的 Linux 服务器上却没有。它在向浏览器提供任何内容之前等待脚本完成,基本上忽略整个刷新命令。
如果有人以前经历过这种情况或知道任何可以提供帮助的东西(无论是服务器配置还是代码调整),我们将不胜感激!
刷新 PHP 的输出缓冲区和刷新 Apache 的缓冲区是两个不同的任务。经常发生这样的情况:您刷新 PHP 的输出缓冲区,但 Apache 不会向浏览器发送任何内容,直到有更多数据为止。此外,有时浏览器在收到足够的数据之前不会显示任何内容。您可以尝试用换行符“填充”输出。
您发布的代码还有两个问题。首先,它启动一次输出缓冲,然后在循环中多次结束它。您要么希望在循环内部也有输出缓冲,要么干脆忽略它。另一个问题是,ob_get_flush()将以字符串形式返回输出缓冲区的内容,而不是回显它。
试试这个代码:
<?php
for($i=0;$i<70;$i++)
{
echo 'printing...<br />';
echo str_repeat("\n",1024);
flush();
usleep(300000);
}
?>
Run Code Online (Sandbox Code Playgroud)
来自 PHP 手册:
lush() 可能无法覆盖 Web 服务器的缓冲方案,并且它对浏览器中的任何客户端缓冲没有影响。[...]
Apache 的服务器模块(例如 mod_gzip)可能会进行自己的缓冲,这将导致 flash() 不会导致数据立即发送到客户端。
甚至浏览器也可能在显示输入之前缓冲其输入。例如,Netscape 会缓冲文本,直到收到行尾或标记的开头,并且在看到最外层表格的标记之前不会呈现表格。
某些版本的 Microsoft Internet Explorer 仅在收到 256 字节的输出后才开始显示页面,因此您可能需要在刷新之前发送额外的空格以使这些浏览器显示页面。
我的示例尝试通过发送 1024 个换行符来解决此问题。
| 归档时间: |
|
| 查看次数: |
11417 次 |
| 最近记录: |