0

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

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

今天我回到项目,结果发现我的服务器不会发送小于 512 字节的字符串。

这是我的代码:

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

    sleep(1);

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

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

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

4

1 回答 1

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)

笔记

  • 如果不使用“用户空间”输出缓冲,那么ob_flush();是多余的。
  • 如果你的循环没有延迟for,那么在行之间刷新不是一个好主意。特别是对于网络尝试将尽可能多的数据打包到单个数据包中的移动应用程序。
  • for循环标头中存在语法错误(表达式$++可能缺少变量标识符i
于 2013-01-09T08:28:03.543 回答