无脂框架冲洗部分输出

时间:2018-03-08 16:02:04

标签: php fat-free-framework

我正在编写一些后台网页来维护我们的系统。 我正在使用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);
    }

每秒输出一个点。

1 个答案:

答案 0 :(得分:2)

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

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

$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