php ob_implicit_flush(),flush(),ob_flush()-无法在远程服务器上运行

zy1mlcev  于 2023-01-19  发布在  PHP
关注(0)|答案(4)|浏览(200)

如果我从XAMPP上的本地服务器在chrome中加载此脚本:

header("Content-Type:text/plain");

set_time_limit(0);

$max = 40;
for ($i = 0; $i < $max; $i++) {
    $response = array(  'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
    echo json_encode($response);
    ob_flush();
    flush();
    sleep(1);
}
ob_clean();

它的工作原理和你想象的一样,每一秒页面都会显示一个新的响应,但是当我把它上传到我的远程服务器(运行相同版本的php)时,它会等到整个脚本完成后才显示输出,对于很长的脚本,它每30 - 60秒左右更新一次输出。
正如标题所示,我试过使用所有不同的flush函数,但都不起作用。可能是本地服务器和远程服务器的php.ini有一些不同,但我不知道是什么。
请帮帮我。

  • --编辑---
    我已经做了一些测试,我注意到它每4096字节更新一次,这恰好是我的远程服务器的php ini中的output_buffering值.然而,由于某些原因,如果我把output_buffering改为'1'或'off',什么都不会改变.它仍然每4096字节更新一次.
    我正在同一个浏览器上的不同服务器上测试2个相同的脚本。
x7yiwoj4

x7yiwoj41#

我没有考虑nginx,它有自己的输出缓冲区。
我只是添加了“header(“X轴加速缓冲:no”);“到PHP脚本的顶部,现在一切都很好。

dtcbnfnu

dtcbnfnu2#

对我来说,添加header('Content-Encoding: none');就可以了,这在使用PHP-FPM时是需要的。

hujrc8aj

hujrc8aj3#

这在Apache + PHP中运行良好

header('Content-Encoding: none');
ob_implicit_flush(1);

echo "<br>PROCESSING bla bla bla";

如果您还想丢弃非常小的数据块,也可以添加下面的行(在每个小数据块之后)。

echo str_repeat(' ',1024*64);
thtygnil

thtygnil4#

在你需要使用ob_start()ob_end_clean()之前,添加头文件Content-LengthTransfer-Encoding: chunked,并检查php.ini中的“implicit_flush”是否为On
为响应添加填充。检查以下代码:

<?php

set_time_limit(0);
ob_start();

header('Content-Type: text/plain');

define("PADDING", 16);

//+padding
for($i=0;$i<PADDING;$i++){
    //64 spaces (1 block)
    echo str_repeat(' ', 64);
}

$max = 40;
for ($i = 0; $i < $max; $i++) {
    $response = array(  'server time: ' . date("h:i:s", time()), 'progress' => round($i/$max*100));
    echo json_encode($response);
    ob_flush();
    flush();
    sleep(1);
}
ob_end_clean();

?>

相关问题