【问题标题】:Showing PHP output as it is being generated在生成 PHP 输出时显示它
【发布时间】:2013-12-07 11:37:43
【问题描述】:

我有一个页面需要几分钟才能调用一些函数。我希望输出在生成时显示。可以这样模拟:

for($i = 0; $i < 5; $i++) {
    sleep(1);
    echo '*';
}

我尝试过使用 flush() 和 ob_flush(),但结果是它只会在 5 秒后立即显示所有星号。

我尝试过这样的事情:

$(function(){
    $('body').load('http://example.com/test.php');
});

但它只是在 5 秒后一次性显示所有星号。

是否可以在 PHP 文件中放入一种标头,以便浏览器在收到内容时加载内容?

jQuery AJAX 能否允许在生成输出时显示输出?如果有,怎么做?

【问题讨论】:

  • 你打过ob_start吗?
  • 你不能可靠地做到这一点,因为从服务器脚本到客户端的路径上有很多缓冲区,但你应该将任务拆分为一个进程并轮询它。
  • 我尝试了一些其他人的代码,有些使用了 ob_start
  • 这到底有什么意义?为什么要在服务器端这样做?
  • 我制作了一个实用程序,它使用在线服务将大约 200 个短语翻译成大约 15 种语言。工作需要几分钟,我想显示语言加上一些点来显示该语言的进度(每个短语一个点)。翻译被保存到数据库中。我认为用 PHP 做这一切会比使用一些 javascript/jQuery 更快。好吧,至少它会更简单。

标签: php jquery flush


【解决方案1】:

查看 jQuery.ajax() 文档中的示例: http://api.jquery.com/jQuery.ajax/

【讨论】:

  • 我不确定如何让 ajax 读取需要几分钟才能完全生成的输入。顺便说一句,我最初用点来表示进度(它涉及将许多短语翻译成其他语言)
  • 我的第一种方法是尝试将大流程拆分为几个小流程,并逐个调用它们。但我不知道你是否可以。
【解决方案2】:

检查php函数flush和ob_flush

这些应该做你想做的,但记得调用 ob_start()

【讨论】:

  • 我已经尝试按照其他人在其他主题中的建议使用它们,但它们都不适合我。
  • 以下不起作用: for($i = 0; $i
  • 如果我记得 ob_start() 必须是脚本上调用的第一个函数。也许这可能是它不起作用的原因。
  • 我试过了:ini_set('output_buffering', 0); ini_set('zlib.output_compression', 0); ini_set('implicit_flush', 1); ob_start(); for($i = 0; $i
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多