我正在使用http上的另一个答案中的一些代码 - 但不知道什么'块'到网页上的音频标签,我想快速启动...这些文件主要是.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;
}
所有建议似乎都是'吮吸它并看到'!
我尝试了从1K到1024k的一系列尺寸获得各种结果,但没有什么显着的。
我还尝试了可变的块尺寸 - 快速拿出一些曲目的播放,并利用这段时间发送更大的块 - 但再次进行了反复试验。
我还必须对各种设置进行Tweek,以阻止PHP/WebServer等"有用"执行自己的缓存!
我现在已经定居在512k上...似乎和任何(!)一样好。
希望这对某人有帮助!
在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 OKrnTransaction-Id:"..., 16384, 0, NULL, NULL) = 14720
recvfrom(41, "332347330Y271263F3147225271264[16b336_346B[n35033621037110371226373:363"..., 16384, 0, NULL, NULL) = 16384
recvfrom(41, "255W23@10325365A<2614\24625234735017346kH250\&`BU337352346m225"..., 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);