【问题标题】:PHP: Output data before and after sleep()?PHP:在睡眠()之前和之后输出数据?
【发布时间】:2011-04-10 18:56:24
【问题描述】:

这纯粹是为了了解有关输出缓冲的更多信息,仅此而已。我想做的是向浏览器回显一个字符串,休眠 10 秒,然后回显其他内容。通常浏览器会等待整整 10 秒,然后发布整个结果,我该如何停止呢?一个例子:

ob_start();
echo "one";
sleep(10);
echo "two";

【问题讨论】:

    标签: php sleep output-buffering


    【解决方案1】:

    faileN 的回答在理论上是正确的。如果没有ob_flush(),数据将保留在 PHP 的缓冲区中并且不会到达浏览器,直到缓冲区在请求结束时被隐式刷新。

    它仍然不起作用的原因是浏览器也包含缓冲区。数据现在已正确发送,但浏览器在获得“一”后等待,然后才真正开始渲染。否则,由于连接速度较慢,页面渲染会非常非常慢。

    解决方法(说明它工作正常)当然是一次发送大量数据(可能是一些巨大的 html 注释或其他东西)或在命令行上使用 curl 之类的工具。

    如果您想在客户端的某些状态更新 UI 上使用此发送/睡眠周期,则必须找到另一种方式(如长轮询和 AJAX)

    【讨论】:

    • 我只是使用了一个 str_repeat 的空格,直到 256 个字节,阅读它会工作,它使它完美无缺。尽管我需要将 \r\n 与内容一起发送,然后才能将其刷新以使其正常工作。感谢您发送大型内容的想法。
    【解决方案2】:
    ob_start();
    echo "one";
    ob_flush();
    sleep(10);
    ob_start();
    echo "two";
    

    你是这个意思吗?

    【讨论】:

    • 这仍然等到最后输出任何东西。
    • 尝试将其添加到脚本的开头:ob_implicit_flush(true);
    • 没用,但我还是让它工作了(请参阅对 pilif 答案的评论),谢谢
    【解决方案3】:

    如果我理解正确,您正在尝试在屏幕上打印部分响应,等待 10 秒并输出其余部分,所有这些都在页面加载时进行。这将需要一些客户端脚本,因为 PHP 将在最后输出整个响应。

    我认为 ob_flush 和 flush 的组合可能会起作用,但缓冲在每个浏览器(例如 IE)上的处理方式不同。

    【讨论】:

      【解决方案4】:

      我为此使用了 JavaScript 的 setTimeOut() 函数。它工作正常。 此外,您可以将 <noscript> 标记用于禁用 JavaScript 的浏览器。

       $txt = setPageHeader();  // a PHP function that returns a new DOCTYPE
                                // plus <html><head>(...)</head>, 
                                // plus an opening <body> tag
      
      echo 'All things were completed. You should be redirected in about 3 seconds';
      
        $txt .= '<script type="text/javascript">';
        $txt = $txt.'function Rediriger() {document.location.replace(\'http://yoursite.com/yourpage.php?anticaching='.rand().'\');}';
        $txt .= 'setTimeout (\'Rediriger()\', \'3000\')';
        $txt .= '</script>';
        $txt .= '<noscript><a href="http://yoursite.com/yourpage.php?anticaching='.rand().'">Javascript is disabled in your browser. Click here for being redirected.</a></noscript>';
        $txt .= '</body></html>';
        echo ($txt);
      

      【讨论】:

        【解决方案5】:

        使用ob_flush() - 但这会清除缓冲区内容。您不能将延迟注入缓冲区,它只是不能那样工作。

        您要么一次输出整个缓冲区,要么保留整个缓冲区以供以后使用。

        【讨论】:

        • 这不是真的:php.net/ob_flush - "这个函数将发送输出缓冲区的内容(如果有的话)。"
        • 是 - 并且“因为缓冲区内容在调用 ob_flush() 后被丢弃。”我从来没有说过 清除缓冲区内容。
        • 这只是表示 echo "a"; ob_flush(); echo "b" 将输出 "ab" 而不是 "aab"。 ob_flush() 发送在 PHP 缓冲区中累积的数据,然后清理该缓冲区。但它被发送出去了。
        【解决方案6】:

        不能因为浏览器等待完整版本的文档,因为什么浏览器引擎解析了 XHTML 页面的一半,然后(如何呈现 XML 的一半?)读取其他部分。

        在通知浏览器之前,您必须考虑发送标头,因为二进制数据已被打磨,然后浏览器在 recv 之后获取您的数据,并可能立即在屏幕上获取此数据。

        我想念这个问题,因为我从没想过注入到字符串缓冲区 10s sleep。

        【讨论】:

          猜你喜欢
          • 2011-03-05
          • 1970-01-01
          • 2010-11-16
          • 2022-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-28
          相关资源
          最近更新 更多