此示例代码的信用额为https://www.htmlgoodies.com/beyond/php/show-progress-report-for-long-running-php-scripts.html。
如果我运行此代码(ubuntu 16.04),则在循环完成之前,我不会在浏览器(chrome)中获得任何结果。在整个脚本完成处理之前,我看不到服务器端事件的任何输出。
除非开始循环之前我将2M数据刷新到浏览器,否则此代码将不起作用。
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
function send_message($id, $message, $progress) {
$d = array('message' => $message , 'progress' => $progress, );
echo "id: $id" . PHP_EOL;
echo "data: " . json_encode($d) . PHP_EOL;
echo PHP_EOL;
ob_flush();
flush();
}
disable_buffer(); // send data to browser to initialize
for($i = 1; $i <= 4; $i++) {
send_message($i, 'on iteration ' . $i . ' of 4' , $i*10);
sleep(1);
}
send_message('CLOSE', 'Process complete', 100);
我要使其正常工作的唯一方法是使用函数disable_buffer();
function disable_buffer() {
@ini_set('zlib.output_compression', 'Off');
@ini_set('output_buffering', 'Off');
@ini_set('default_charset', 'utf-8');
@apache_setenv('no-gzip', 1);
echo str_repeat('.', 2222000).PHP_EOL;
flush();
}
具体来说,如果没有...,它将无法正常工作
echo str_repeat('.', 2222000).PHP_EOL;
flush();
为什么必须将2M数据刷新到浏览器?如果不这样做,浏览器将在整个脚本完成之前看不到任何内容。如果我先发送2M,则一旦发送,我就可以在浏览器中看到它们。