我正在寻找一种方法,以尽可能快的方式将数据输出到尽可能多的客户端,并且没有延迟。所以我想把预压缩数据输出分成块,以便客户端的浏览器可以更快地识别数据。这是我到目前为止用于将输出分成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();
?>
有没有办法可以在不计算字符串长度的情况下这么多次?我正在寻找基本相当于我所拥有的东西,除了它需要更快地执行。
答案 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
实际上并不是一项昂贵的操作。额外的内存分配和分块输出会使这种情况变慢。