尽可能快地推出分块字节

pushing out chunked bytes as fast as possible

我正在寻找一种将数据输出到尽可能多的客户端的方法,尽可能快且没有延迟。所以我想到将预压缩的数据输出分成块,以便客户端的浏览器可以更快地识别数据。到目前为止,这是我将输出分成 1500 字节块的代码(我选择 1500 是因为它与服务器的以太网 MTU 相匹配)。

<?php
    $chunk="<about 7kb gzipped data>";
    header("Content-length: ".strlen($chunk),true);
    flush();
    while (1){
        $sz=strlen($chunk);
        if ($sz > 1500){$sz=1500;}
        echo substr($chunk,0,$sz);
        flush();
        $chunk=substr($chunk,$sz);
        $sz=strlen($chunk);
        if ($sz < 1500){break;}
    }
    echo $chunk;
    flush();
?>

有没有办法不用多次计算字符串长度就可以做到这一点?我正在寻找基本上与我所拥有的等效的东西,只是它需要执行得更快。

如果 $chunk 在脚本执行期间 没有改变 那么就不需要截断字符串。所有这一切都是通过分配多个块来浪费内存。

PHP 将 不会 释放您的内存分配,直到脚本结束,并且每个字符串操作(例如 substr)将为它的结果。这意味着您的内存使用量将比 7kb 高一个数量级才能写出这么短的数据量。

通过直接从主字符串:

$chunk="<about 7kb gzipped data>";
$sz=strlen($chunk);
header("Content-length: ".$sz,true);
flush();
$pos=0;    
while ($pos <= $sz){
    echo substr($chunk,$pos,1500);
    flush();
    $pos += 1500;
}

但是,请实际测试一下,因为我敢打赌下面的速度 很多 因为 PHP 解释器在处理这类事情和您的 Web 服务器时非常高效无论如何都会做相当聪明的缓冲。试图解决它通常是一场失败的游戏。

$chunk="<about 7kb gzipped data>";
echo $chunk;

还要注意 PHP stores the length of a string in a hidden field,所以 strlen 实际上并不是一个昂贵的操作。这是额外的内存分配和分块输出导致速度变慢的原因。