【问题标题】:Is there a way to make PHP progressively output as the script executes?有没有办法让 PHP 在脚本执行时逐步输出?
【发布时间】:2011-01-31 13:41:09
【问题描述】:

所以我正在编写一个一次性脚本供我个人使用,我希望能够看到这个过程是如何进行的。基本上我正在处理几千个媒体发布并将它们发送到我们的新 CMS。

所以我不会敲击 CMS,我会在每 5 个请求后创建脚本 sleep 几秒钟。

我希望 - 在脚本正在执行时 - 能够看到我的 echos 告诉我脚本将要休眠或与网络服务的最后一次交易成功。

这在 PHP 中可行吗?

感谢您的帮助!

伊恩

【问题讨论】:

  • 我确实注意到,在特别长的脚本上,PHP 似乎开始发送缓冲区中的内容,即使脚本尚未完成执行 - 有什么方法可以劫持吗?
  • Hmmmm... 作为事后的想法 - 也许 PHP is 实际上正在发送缓冲区,只是我的浏览器没有向我显示它... ermmm ..救命?!
  • 您是否在控制台中运行脚本?还是在浏览器中?
  • 感谢卡森,在浏览器中。

标签: php streaming progress-bar outputstream output-buffering


【解决方案1】:

使用ob_flush 发送缓冲区中的任何数据。所以你可以执行一些命令,刷新输出,然后在处理更多命令之前休眠一下。

我确实注意到,在特别长的脚本中,PHP 似乎开始发送缓冲区中的内容,即使脚本尚未完成执行

默认情况下,PHP 永远不会回显任何内容,直到整个脚本执行完毕。那只是你的浏览器试图一次输出太多数据,或者你有什么东西导致它在某个地方刷新。

【讨论】:

  • PHP 缓冲输出,在长脚本上,这个缓冲区变满,所以它的数据被发送出去(你可以调整缓冲区的大小或强制 php 在发送前缓冲所有输出)
  • 我打勾是因为它引导我找到正确的答案。其他这样做的人请注意:您需要将 php.ini 文件中的 output_buffering 设置为 0 - 这是我认为的性能损失,所以它适用于我 - 但我会怀疑在生产。另外,调用ob_flush() 后,还需要调用flush() 发送输出。希望这会有所帮助!
【解决方案2】:

这是一个包装它的 PHP 包:

https://packagist.org/packages/coderofsalvation/browser-stream

   BrowserStream::enable();
    BrowserStream::put("loading");

    for( $i = 0; $i < 10; $i++ ){
        BrowserStream::put(".");
        sleep(1);
    }

【讨论】:

  • 这太棒了!谢谢
【解决方案3】:

您可以尝试使用flush 并查看其他output control functions,但它们可能没有任何用处。无论如何,您的网络服务器软件可能会缓冲响应。

【讨论】:

    【解决方案4】:

    您可能想探索刷新命令http://php.net/manual/en/function.flush.php

    【讨论】:

    • 因为输出是缓冲的,在调用'echo'语句时不一定会输出。
    猜你喜欢
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2016-06-07
    相关资源
    最近更新 更多