我在使用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中,让用户在需要时暂停并恢复下载
谢谢!