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