我正在使用php下载文件的程序。
脚本请求如下:http://localhost/download.php?file=abc.zip
我使用了Resumable downloads when using PHP to send the file?
它绝对适用于300M以下的文件,无论是多线程还是单线程下载,但是,当我尝试下载文件> 300M时,我在单线程下载时遇到问题,我只下载了 250M 数据,然后似乎http连接被破坏了。它不会突破断点 ..为什么? 调试脚本,我找到了它破坏的地方:
$max_bf_size = 10240;
$pf = fopen("$file_path", "rb");
fseek($pf, $offset);
while(1)
{
$rd_length = $length < $max_bf_size? $length:$max_bf_size;
$data = fread($pf, $rd_length);
print $data;
$length = $length - $rd_length;
if( $length <= 0 )
{
//__break-point__
break;
}
}
这似乎每个请求的文档只能获得250M数据缓冲区到echo
或print
..但是当我使用多线程下载文件时它可以工作
答案 0 :(得分:0)
fread()将读取您要求的字节数,因此您正在做一些不必要的工作来计算要读取的字节数。我不知道单线程和多线程下载的含义。你知道readfile()只是转储整个文件吗?我假设您需要从$ offset开始读取文件的一部分,最长为$ length bytes,对吗?
我还会检查我的网络服务器(Apache?)配置和ISP限制(如果适用);您的最大响应大小或时间可能受到限制。
试试这个:
define(MAX_BUF_SIZE, 10240);
$pf = fopen($file_path, 'rb');
fseek($pf, $offset);
while (!feof($pf)) {
$data = fread($pf, MAX_BUF_SIZE);
if ($data === false)
break;
print $data;
}
fclose($pf);