我正在使用来自另一个答案的一些代码来通过http传输音频 - 但不知道什么'chunksize'最好...文件可能非常大,并且流式传输到网页上的音频标签,我想快速启动......文件主要是.wav和.mp3
function streamfile($filename, $retbytes = TRUE) {
$CHUNK_SIZE = 1024*1024; // Size (in bytes) of tiles chunk
$buffer = '';
$cnt =0;
// $handle = fopen($filename, 'rb');
$handle = fopen($filename, 'rb');
if ($handle === false) {
return false;
}
while (!feof($handle)) {
$buffer = fread($handle, $CHUNK_SIZE);
echo $buffer;
ob_flush();
flush();
if ($retbytes) {
$cnt += strlen($buffer);
}
}
$status = fclose($handle);
if ($retbytes && $status) {
return $cnt; // return num. bytes delivered like readfile() does.
}
return $status;
}
答案 0 :(得分:0)
所有建议似乎都是“吮吸并看到”!
我尝试了从1k到1024k的各种尺寸获得各种结果,但没什么了不起。
我还尝试了可变的块大小 - 快速获取一些内容并使用该时间发送更大的块 - 但同样是它,试验和错误。
我还必须调整各种设置来阻止PHP / webserver等“帮助”进行自己的缓存!
我现在已经确定了512k ......看起来和任何(!)一样好。
希望这有助于某人!
答案 1 :(得分:0)
在Linux系统上如果使用命令strace
监视系统活动,您很快就会发现脚本的局限性。
例如,监控curl
请求的性能,您可能会发现带宽是限制因素
它可能会显示为示例:
socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 41
fcntl(41, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(41, F_SETFL, O_RDWR|O_NONBLOCK) = 0
connect(41, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("<some.ip>")}, 16) = -1 EINPROGRESS (Operation now in progress)
sendto(41, "GET /some-service/some"..., 3480, MSG_NOSIGNAL, NULL, 0) = 3480
recvfrom(41, "HTTP/1.1 200 OK\r\nTransaction-Id:"..., 16384, 0, NULL, NULL) = 14720
recvfrom(41, "\332\347\330Y\271\263F\314\7\225\271\264[16b\336_\346B[\n\350\336\210\371\10\371\226\373:\363"..., 16384, 0, NULL, NULL) = 16384
recvfrom(41, "\255W\23@\10\325\365A<\26\1\4\\\246\252\347\350\17\346kH\250\\&`BU\337\352\346m\225"..., 16384, 0, NULL, NULL) = 12223
close(41) = 0
在本例中,您会看到您收到3个包含14,16和12 kB的包,默认情况下上限为16kB。 由于带宽限制不允许在所需的读取时间限制内填满内部缓冲区,因此未填充第一个包。 如果要更改PHP引擎的内部块限制,可以使用以下命令来执行此操作:
$handle = fopen($filename, 'rb');
stream_set_chunk_size($handle, $CHUNK_SIZE);
stream_set_read_buffer($handle, $CHUNK_SIZE);