<?php
ob_start();
echo 'test';
ob_end_flush();
flush();
sleep(10);
我尝试在连接完成之前输出 ajax 请求的响应,但是不起作用——它会等待 10 秒钟才能成功获取响应。这是 http 服务器的问题吗?在我的情况下是 Apache?如果是的话,如何修复它以便它立即回显响应?
答案1
虽然flush()
,ob_end_flush()
和ob_flush()
应该可以保证输出被发送到服务器,但我发现 PHP 有时对特定的软件配置不是很宽容。
尤其是在 Windows 上,设置输出缓冲可能很麻烦,我发现在系统之间可靠运行的唯一方法是在每次刷新时重置输出缓冲,如下所示:
<?php
obf_start();
for($i=0;$i<70;$i++) {
echo 'printing... ', microtime(true), '<br />';
if($i % 3 == 2) obf_flush();
usleep(300000);
}
function obf_start() {
ob_start();
}
function obf_flush() {
ob_end_flush();
ob_flush();
flush();
obf_start();
}
这是一个丑陋的解决方案吗?是的。但直到所有与输出缓冲相关的错误已经修复,我认为这种解决方法不会很快在生产代码中消失。
还请注意,某些防病毒软件(Panda AV 等)和代理会保留所有数据,直到套接字关闭。您无法保证所有客户端都会收到正确的刷新数据。
答案2
要知道某件事是服务器问题还是浏览器/库问题,最简单的方法就是实时监控请求。对于你的情况,最简单的两种方法是:
- 萤火虫:此 Firefox 扩展将在发送时实时显示所有 AJAX 请求,并在浏览器收到响应后立即显示响应。
- 流量捕获:使用 Wireshark 等工具查看发送的任何类型的请求以及实时从服务器返回的 tcp 流量。
如果您看到数据立即返回,但需要 10 秒才能显示,则您的浏览器或 AJAX 库正在等待连接关闭后再处理响应。如果您需要 10 秒才能收到任何返回结果,则您的服务器或 PHP 模块存在问题。