当我使用这个phpcode下载一个下载量为300Kb / s的文件时,我使用这个:
function readfile_chunked($dl_link, $filesize_file) {
$chunksize = 300*1024; #Buffersize in Byte
$data = '';
$handle = fopen($dl_link, 'rb');
while (!feof($handle)) {
$data = fread($handle, $chunksize);
sleep(1);
print $data;
@ob_flush();
@flush();
}
fclose($handle);
}
但它不起作用! : - (
当我开始下载时,速度低于1 KB / s,它会中断然后恢复,依此类推。
当我在上面的代码中取消“sleep(1)”时,下载开始,一切都很好,但它以全速运行。 - >逻辑!
为什么会这样?
答案 0 :(得分:2)
看起来大概没问题,但请尝试以下方法:
function readfile_chunked($path, $speed)
{
if (is_file($path) !== true)
{
exit('not a local file');
}
header('Pragma: public');
header('Cache-Control: public, no-cache');
header('Content-Type: application/octet-stream');
header('Content-Length: ' . filesize($path));
header('Content-Disposition: attachment; filename="' . basename($path) . '"');
header('Content-Transfer-Encoding: binary');
$handle = fopen($path, 'rb');
while (!feof($handle))
{
echo fread($handle, $speed * 1024); sleep(1);
while (ob_get_level() > 0)
{
ob_end_flush();
}
flush();
}
fclose($handle);
}
readfile_chunked('/path/to/your/file.ext', 300);
答案 1 :(得分:0)
您可能希望首先尝试添加@ob_flush_end()
以禁用输出缓冲,并在循环中删除@ob_flush()
。延迟可能是因为输出缓冲。
您也可以尝试将print
替换为echo
。您可能会获得一些性能提升。
同时尝试使用较小的块并使用usleep
来缩短延迟时间。