用PHP下载大文件,最大8192字节?

时间:2014-08-07 14:58:16

标签: php cakephp

我使用以下代码下载大文件(> 100mb)。代码在shell中执行。

$fileHandle = fopen($url, 'rb');
$bytes = 100000;

while ($read = @fread($fileHandle, $bytes)) {
    debug(strlen($read));

    if (!file_put_contents($filePath, $read, FILE_APPEND)) {
        return false;
    }
}

我希望debug(strlen($read))输出100000,这是实际输出:

10627
8192
8192
8192
...

为什么第一次没有fread读取8192以上的10627字节,为什么在第一次迭代时读取{{1}}个字节?

这使得下载文件的速度非常慢,有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

您的问题的答案是(引用fread()的PHP文档):

  

如果流被读缓冲并且它不表示普通文件,则最多读取一个等于块大小(通常为8192)的字节数;根据先前缓冲的数据,返回数据的大小可能大于块大小

您的性能问题的解决方案是使用stream_copy_to_stream(),它应该比使用fread()的块读取更快,并且还有更高的内存效率

答案 1 :(得分:0)

我检查了手册,发现了这个:http://php.net/manual/en/function.fread.php "如果流被读缓冲并且它不代表普通文件,则最多读取一个等于块大小(通常为8192)的字节数;"

由于您正在打开网址,因此可能就是这种情况。 它虽然没有解释10627 ......

除此之外,为什么期望100000字节读取比8192快? 我怀疑这是你的瓶颈。我的猜测是,从URL的下载速度或HD的写入速度是问题。