尽可能快地推出分块字节

时间:2016-01-12 01:35:07

标签: php string byte chunks

我正在寻找一种方法,以尽可能快的方式将数据输出到尽可能多的客户端,并且没有延迟。所以我想把预压缩数据输出分成块,以便客户端的浏览器可以更快地识别数据。这是我到目前为止用于将输出分成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();
?>

有没有办法可以在不计算字符串长度的情况下这么多次?我正在寻找基本相当于我所拥有的东西,除了它需要更快地执行。

1 个答案:

答案 0 :(得分:1)

如果$chunk在执行脚本期间没有更改,则无需删除字符串。所有这一切都是通过分配多个块来浪费内存。

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

它会更快(更少的malloc调用,这是昂贵的)并且更容易在内存上(只需要超过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实际上并不是一项昂贵的操作。额外的内存分配和分块输出会使这种情况变慢。