网上流传的几种方法,我只测试了其中的一个
1.curl 流方式下载大文件 只测试了这一个
// 写视频文件, 并重命名
$videoUrl = $data2[$s]['video_url'];
if (!empty($videoUrl)) {
#下载文件
set_time_limit(0);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$videoUrl);
// 忽略ssl证书
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE );
$file_path = $path . $data2[$s]['id'] . '.mp4';
$fp = fopen($file_path, 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec ($ch);
curl_close ($ch);
fclose($fp);
}
2. 直接下载网址对应的大文件
function downloadFile($filename, $save_to) {
//获取文件的扩展名
$allowDownExt = array ( 'rar', 'zip', 'png', 'txt', 'mp4', 'html', 'apk');
//获取文件信息
$fileExt = pathinfo($filename);
//检测文件类型是否允许下载
if(!in_array($fileExt['extension'], $allowDownExt)) {
return false;
}
//设置脚本的最大执行时间,设置为0则无时间限制
set_time_limit(0);
ini_set('max_execution_time', '0');
//通过header()发送头信息
//因为不知道文件是什么类型的,告诉浏览器输出的是字节流
// header('content-type:application/octet-stream');
//告诉浏览器返回的文件大小类型是字节
// header('Accept-Ranges:bytes');
//获得文件大小
//$filesize = filesize($filename);//(此方法无法获取到远程文件大小)
$header_array = get_headers($filename, true);
$filesize = $header_array['Content-Length'];
//告诉浏览器返回的文件大小
// header('Accept-Length:'.$filesize);
//告诉浏览器文件作为附件处理并且设定最终下载完成的文件名称
// header('content-disposition:attachment;filename='.basename($filename));
//针对大文件,规定每次读取文件的字节数为4096字节,直接输出数据
$read_buffer = 4096;
$handle = fopen($filename, 'rb');
//总的缓冲的字节数
$sum_buffer = 0;
//只要没到文件尾,就一直读取
$h = fopen($save_to, 'wb');
// $i = 10;
while(!feof($handle) && $sum_buffer<$filesize) {
$res = fread($handle,$read_buffer);
fwrite($h, $res);
// $i++;
// if ($i > 1000) {
// die;
// }
$sum_buffer += $read_buffer;
}
//关闭句柄
fclose($handle);
}
3. curl内的回调函数
$ch = \curl_init($url);
\curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
\curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
\curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArr);
\curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
\curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
\curl_setopt($ch, CURLOPT_TIMEOUT, 3600);
curl_setopt($ch, CURLOPT_BUFFERSIZE, 20971520);
$flag=0;
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($ch ,$str) use (&$flag){
$len = strlen($str);
$flag++;
$type = \curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
if($flag==1){
$size = \curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
$type = \curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$httpcode = \curl_getinfo($ch, CURLINFO_HTTP_CODE);
\header("HTTP/1.1 ".$httpcode);
\header("Content-Type: ".$type);
\header("Content-Length: ".$size);
\header('Content-Transfer-Encoding: binary');
\header('Cache-Control:max-age=2592000');
}
echo $str;
return $len;
});
$output = \curl_exec($ch);