尽可能快地推出分块字节
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
实际上并不是一个昂贵的操作。这是额外的内存分配和分块输出导致速度变慢的原因。
我正在寻找一种将数据输出到尽可能多的客户端的方法,尽可能快且没有延迟。所以我想到将预压缩的数据输出分成块,以便客户端的浏览器可以更快地识别数据。到目前为止,这是我将输出分成 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
实际上并不是一个昂贵的操作。这是额外的内存分配和分块输出导致速度变慢的原因。