在PHP中下载一个大文件,最大8192字节


cakeDownloading a large file in PHP, max 8192 bytes?

我使用以下代码下载一个大文件(>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字节?

这使得下载文件非常慢,有没有更好的方法来做到这一点?

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

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

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

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

因为你正在打开一个URL,这可能是这种情况。但它并没有解释10627…

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