下载大文件并在本地编写

时间:2011-02-15 21:04:04

标签: php

这是从php大文件下载而不消耗所有服务器内存的最佳方式吗?

我可以这样做(坏代码):

$url='http://server/bigfile';
$cont = file_get_contents($url);
file_put_contents('./localfile',$cont);

此示例在$cont中加载条目远程文件,这可能会超出内存限制。

是否有安全功能(可能内置)来执行此操作(可能是流_ *)?

由于

2 个答案:

答案 0 :(得分:4)

这是我下载大文件时使用的功能。它将避免将整个文件加载到缓冲区中。相反,它会在收到字节时写入目标。

function download($file_source, $file_target) 
{
    $rh = fopen($file_source, 'rb');
    $wh = fopen($file_target, 'wb');
    if (!$rh || !$wh) {
        return false;
    }

    while (!feof($rh)) {
        if (fwrite($wh, fread($rh, 1024)) === FALSE) {
            return false;
        }
    }

    fclose($rh);
    fclose($wh);

    return true;
}

答案 1 :(得分:3)

您可以使用curl和CURLOPT_FILE选项将下载的内容直接保存到文件中。

set_time_limit(0);
$fp = fopen ('file', 'w+b');
$ch = curl_init('http://remote_url/file');
curl_setopt($ch, CURLOPT_TIMEOUT, 75);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec($ch);
curl_close($ch);
fclose($fp);