【问题标题】:fat-free framework flush partial output脱脂框架flush部分输出
【发布时间】:2018-03-08 16:02:03
【问题描述】:

我正在编写一些后台网页来维护我们的系统。 我正在使用 F3 我有一条处理时间长的路线,分为许多子流程。 我为每个子流程制作了一个模板,这样:

$f3->route('GET /someroute', function($f3) {
   dosomework();
   echo template::instance()->render('template-job1.html');

   dosomeotherwork();
   echo template::instance()->render('template-job2.html');
}

我希望我在浏览器部分输出准备就绪时进入(一次一个模板),但我得到的是我必须等待所有输出。

如果我尝试使用标准 php 输出(例如,使用一些 sleep() 和一些 echo()),我会逐行得到,而不是在进程结束时全部放在一起。

另一个 f3 示例:

$f3->route('GET /output', function($f3) {
    echo "pippo\n";

    for ($i=0;$i<100;$i++) {
        echo ".";
        sleep(1);
    }
});

100 秒后输出。相反,如果我写一个简单的 php 页面:

<?php
echo "pippo2\n";

    for ($i=0;$i<100;$i++) {
        echo ".";
        sleep(1);
    }

每秒输出一个点。

【问题讨论】:

    标签: php fat-free-framework


    【解决方案1】:

    这是因为框架使用 PHP 的 output buffering control 将完整的响应发送到客户端之前存储了它。

    所以你应该先禁用输出缓冲区并打开隐式输出刷新:

    $f3->route('GET /output', function($f3) {
    
        // disable output buffering
        while (ob_get_level())
            ob_end_flush();
    
        // turn implicit flush
        ob_implicit_flush(1);
    
        // now every output call should be flushed instantly to the client
        for ($i=0;$i<10;$i++) {
            echo $i;
            sleep(1);
        }
    
    });
    

    NB1:禁用输出缓冲将阻止框架填充RESPONSE 变量。

    NB2:某些浏览器可能会自己缓冲接收到的输出,即在显示之前等待最少的数据量。详情请见flush

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 2015-04-26
      • 2014-02-06
      • 1970-01-01
      相关资源
      最近更新 更多