第一次刷新会导致PHP Apache2缓冲区问题

时间:2019-01-30 05:05:18

标签: php apache2 ubuntu-16.04

此示例代码的信用额为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,则一旦发送,我就可以在浏览器中看到它们。

0 个答案:

没有答案