PHP输出缓冲区“Millenium”Bug?

时间:2013-01-08 17:25:47

标签: php buffer flush minimum output-buffering

我今天遇到了一个奇怪的问题。

几个月来,我在PHP中使用缓冲区刷新来向客户端发送小字符串大小而没有问题。

今天我回到了项目,事实证明我的服务器不会发送小于512字节的字符串。

这是我的代码:

<?php
    echo "length:".$myUpcomingStringSize;
    ob_flush();
    flush();

    sleep(1);

    for($i = 0; $i < count($allLines); $++) {
        echo $allLines[$i];
        ob_flush();
        flush();
    }
?>

这段代码在整个去年都像魅力一样。而现在它已不复存在了。我玩了一下,添加了一些随机字符。当字符串大小等于或大于512时,服务器发送缓冲区内容。

有人能想象我必须在这里解决的问题吗?其他人面临这个问题?或者 有人知道如何配置这个最小数据包大小吗?

1 个答案:

答案 0 :(得分:1)

如果您既不更改程序也不更改服务器,则应该假定程序从未按预期工作。特别是Windows系统已知缓冲输出,直到输出缓冲区中有一定数量的字节。此缓冲在系统级别,因此不受任何PHP配置的影响。

如果您知道512字节是输出缓冲区发送所需的最小值,那么您可以使用类似

的内容
define('MIN_OUTPUT_LENGTH', 512);
echo str_pad("length: $myUpcomingStringSize", MIN_OUTPUT_LENGTH, "\0"), '\n';
// (If you run into trouble with the null-bytes, use space character instead)

备注

  • 如果您不使用“userspace”输出缓冲,则ob_flush();是多余的。
  • 如果你的for循环没有延迟,那么在行间冲洗不是一个好主意。特别是对于网络试图将尽可能多的数据打包到单个数据包中的移动应用程序。
  • for循环标头中存在语法错误(表达式$++缺少变量标识符,可能是i