PHP cURL流大文件:不能使用RAM

时间:2014-07-30 15:19:03

标签: php curl stream download

我在使用cURL从远程服务器到客户端的大文件时遇到了一些问题;

问题是,似乎下载是在将RAM下载到客户端时设置的......

我使用cURL是因为我需要一个cookie auth:/

这是一个小例子:

function streamContent($url)
{
    session_write_close();

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FILETIME, true);
    curl_setopt($curl, CURLOPT_COOKIEFILE, 'mycookie');
    curl_setopt($curl, CURLOPT_COOKIEJAR, 'mycookie');
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_NOPROGRESS, false);
    curl_setopt($curl, CURLOPT_PROGRESSFUNCTION, "progress");
    curl_setopt($curl, CURLOPT_HEADERFUNCTION, "streamHeader");
    curl_setopt($curl, CURLOPT_WRITEFUNCTION, "myProgressFunc");

    curl_exec($curl);
    curl_close($curl);
}


function myProgressFunc($curl, $str)
{ 
    echo $str;

    return strlen($str);
}

function progress($curl, $download_size, $downloaded, $upload_size, $uploaded) {
    $r = fopen('test_for_tail.txt', 'a+');
    $time = microtime(true);
    fputs($r, $time.' - '.$downloaded.'/'.$download_size.PHP_EOL);
    fclose($r);
}

function streamHeader($curl, $string)
{
    $stringTrim = trim($string);
    if(!empty ($stringTrim)) {
        if(!preg_match('~chunk~i', $stringTrim)) header($stringTrim);
    }

    return strlen($string);
}

$file = '.....';
streamContent($file);

现在,我在浏览器中启动脚本,并执行" tail -f test_for_tail.txt"

文件" test_for_tail.txt"是填充,但当我设置下载"暂停"时,文件继续填充... 如果我停止下载,那么这个过程如果破了,那就很好。

我想" test_for_tail.txt"文件已填满,因为下载是在RAM上完成的,然后再将其提供给客户端

我可以避免吗?

因为100个文件有2go的文件而且我死了...... ^^

目标是将文件流式传输到客户端,而不是将其全部放入RAM中,让用户在需要时暂停并恢复下载

谢谢!

0 个答案:

没有答案