大文件下载如何不导致内存溢出
public function testDownload(){
set_time_limit(0);
//$file_name = 'live.mp4';
// 打开文件
$newf = fopen(storage_path('logs/').'video','wb');
$logf = fopen(storage_path('logs/').'memory','wb');
$url = 'http://minsheng.zmeng123.com/admin/Index/index.html';
$fp = fopen($url, 'rb');
$chunk_size = 300; // 3MB
// 设置指针位置
// fseek($fp, 0);
// 开启缓冲区
ob_start();
// 分段读取文件
while (!feof($fp)) {
echo fread($fp, $chunk_size); //输出数据到php缓冲区
$data = ob_get_contents(); //获取缓冲区中的内容
fwrite($newf,$data);
$log = memory_get_usage()."\n"; //记录内存使用情况
fwrite($logf,$log);
ob_clean(); //删除缓存区中的数据
//ob_flush(); //刷新php缓冲区中的内容到服务器
// flush(); //刷新web服务器缓冲区到客户端
// sleep(1); // 每1秒 下载 2 MB
}
// 关闭缓冲区
ob_end_clean();
fclose($fp);
fclose($newf);
fclose($logf);
exit();
}
//通过每次读取固定的数据存到缓冲区,然后读取缓冲区的数据写入文件后清空缓冲区来达到控制使用内存大小的结果。让下载大文件数据时不会导致内存溢出。还可以通过sleep函数来限制下载的速率