【问题标题】:Can't get PHP flush to work no matter what I try无论我尝试什么,都无法让 PHP 刷新工作
【发布时间】:2014-06-25 00:06:31
【问题描述】:

好吧,我不知道为什么 flush() 不起作用。我到处搜索这个问题,但没有成功。目前我没有 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 提交数据并发送成功并继续处理信息。在脚本的其余部分运行时,用户不应该等待。如果我直接调用文件,我什至无法让它工作!不管我怎么操作,两个回声同时吐出!

【问题讨论】:

  • 在后台运行它,轮询数据库以获取结果,我不认为使用刷新是正确的方法
  • 一直以来我的理解是flush()依赖于用户代理,大多数用户代理会在更新之前等待最少量的内容。这就是为什么许多依赖刷新的系统使用echo str_pad('', 4096); 之类的东西来达到最低阈值......但是我不知道这是否会像你期望的那样在 AJAX 上工作(不太可能),作为方式这些请求的处理方式与代理呈现页面的方式不同。 stackoverflow.com/questions/14574432/…
  • ob_get_level() 说什么?
  • ob_flush() 发送输出缓冲区的当前内容。看起来您没有使用输出缓冲,所以缓冲区将为空,ob_flush() 不会做任何事情。您的输出已发送给客户端。
  • ob_get_level() 显示 1. Dagon 我宁愿这一切都发生在一个电话中。这实际上是有效的,然后我的主机决定将 PHP 从 5.2 升级到 5.3。即使output_buffering 开启和implicit_flush 关闭,ob_flush() 也无法正常工作。我真的倾向于这是一些不寻常的东西,比如 php 设置或奇怪的服务器设置。

标签: php ajax flush


【解决方案1】:

上帝原谅我这段代码:

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 错误 以实现实际有用目的(搜索索引)的 PHP 项目。

【讨论】:

  • 请注意,ob_start 可能用于避免打印警告。坦率地说,我不记得了。
  • 虽然我非常感谢您在这里写的内容,但它仍然无法正常工作。我也再次启用了缓冲。
  • 我已经成功使用了这个代码很多次。很抱歉,它不适合你。我还建议您不要从脚本中输出任何内容(但如果出现问题,请吐出 500 标题)。
  • 谢谢塔康。我很欣赏这个剧本。它真的是经过深思熟虑的。我真的认为我的托管公司正在阻止它。不确定,但我有这个工作,然后突然就不行了。
【解决方案2】:

所以这个问题是因为“需要在 FastCGI 配置中设置“OutputBufferSize 0”,否则 mod_fcgid 会在 PHP 之外做它自己的输出缓冲。”这是我在托管服务器上无法控制的事情。希望这对某人有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    相关资源
    最近更新 更多