我使用以下代码下载大文件(> 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}}个字节?
这使得下载文件的速度非常慢,有更好的方法吗?
答案 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的写入速度是问题。