关于PHP flush()缓存输出的应用
经过几轮测试,个人总结有效方法有两种。百度智能云, 天翼云已经测试过了。
第一种:
public function get_data() {
set_time_limit(0);
ignore_user_abort(true);
header('X-Accel-Buffering: no');
$k = 0;
$arr = [];
for($i = 0; $i < 10000; $i++) {
$arr[] = $i;
}
foreach($arr as $key =>$value) {
$j = round($key/count($arr), 2)*100;
if($j == 80) {
return json(['code' => 1, 'msg' => '错误', 'row' => $key]);
}
if($j != $k && floor($j) == $j) {
$k = $j;
echo 'str';
ob_flush();
flush();
}
}
return json(['code' => 0, 'msg' => '完成']);
}
用header + echo + ob_flush() + flush() 的方式输出。
header('X-Accel-Buffering: no');
---------------------------------
echo 'str';
ob_flush();
flush();
第二种:
public function show_msg($msg) {
echo $msg.' '.str_repeat(' ', 1024*4).'';
ob_flush();
flush();
usleep(10000);
}
用字符串占满缓冲器输出
echo $msg.' '.str_repeat(' ', 1024*4).''; -->看服务器设置缓存大小,设置冲出大小
------------------------------------------
ob_flush();
flush();
参考手册: 《PHP参考手册》