无论我尝试什么,都无法让PHP刷新工作

时间:2014-06-25 00:06:31

标签: php ajax flush

好的,我的生活中我无法弄清楚为什么flush()不起作用。我用Google搜索了这个问题并没有成功。目前我没有nginx或fastCGI(已被提及有特殊需求)。我有一个php.ini覆盖文件来更改这些值:

output_buffering = Off
implicit_flush = 1
zlib.output_compression = 0

我在实际的php中尝试过阳光下的一切,但这就是我现在所拥有的:

ignore_user_abort(true);
set_time_limit(0);
header('Content-Encoding: none;');
header('X-Accel-Buffering: no');
header("Connection: close");
echo 'success?';
ob_flush();
flush();

/******** background process starts here ********/

sleep(2);
echo 'dammit';

这只是测试信息。最终目标是使用jquery通过ajax POST提交数据并发回成功并继续处理信息。在脚本的其余部分运行时,用户不应该等待。如果我直接调用文件,我甚至无法使用它!无论我如何工作,两个回声都会同时吐出来!

2 个答案:

答案 0 :(得分:3)

天啊,请原谅我这段代码:

protected function detachBrowser()
{
    ob_start();

    // tell PHP to ignore if the browsers closes connection
    @ignore_user_abort(true);
    // check it worked 
    $defer = @ignore_user_abort();
    // according to the docs, in some cases on IIS+CGI
    // ignore_user_abort does not work
    // If so, just abort.
    if (!$defer)
    {
        throw new RuntimeException("Webserver does not support ignore_user_abort()");
    }

    // remove the buffer, even nested ones
    while (ob_get_level()) ob_end_clean();

    /* close the frigging connection with the browser, and help IE understand the message */
    ob_start();
    header('Content-Type: text/plain');
    header('Content-Length: 0');
    header("Content-Encoding: none\r\n");
    header('Connection: close');
    // we need all three, in this precise order
    @flush();
    @ob_end_flush();
    @ob_flush();
}

编辑:我从DokuWiki派生了此代码,这是实现 web bug 的第一个PHP项目之一,用于实际有用的目的(搜索索引)

答案 1 :(得分:1)

所以这个问题是因为"" OutputBufferSize 0"需要在FastCGI配置中设置,否则mod_fcgid除了PHP之外还会自己执行输出缓冲。"这是我在托管服务器上无法控制的。希望这有助于某人!!