无脂框架刷新部分输出

fat-free framework flush partial output

我正在编写一些后台网页以维护我们的系统。 我用的是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 的 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