无脂框架刷新部分输出
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。
我正在编写一些后台网页以维护我们的系统。 我用的是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。