php导出文件(一):导出csv超大文件

在做后台任务的时候,经常会遇到需要导出excel表格的情况,php插件里也提供了php_excel组件,功能也十分强大,但是在做导出超大文件的时候就会遇到内存溢出,运行时间超限的问题,并且无法回避,这是因为php_excel会将整个工作表都存在内存当中,数据太多肯定会内存溢; 并且对于excel的操作来说,如果在本地打开一个几十mb大小的excel文件基本也会很慢,再对其进行各种计算或操作也是很不友好的,直对来说csv文件会更加轻量,对服务器来说,csv文件的操作在I/O方面,内存使用相对很小,所以在做作数据导出时基本上都采用csv文件格式。
今天做个小记,代码如下:

//方法1:  打开一次文件,以追加的方式写入数据,会一直占用该文件资源,直到文件被关闭,资源被释放
function exportCsv1(){
     
	$title = ['id','name','time'];
	$file = date('Ymd').'_export.csv';
	$fp = fopen($file,'w+'); //w+以追加的方式写入文件
	if(flock($fp,LOCK_EX)){
     
		//文件加独占锁,是否加锁看实际需求 共享锁LOCK_SH 独占锁LOCK_EX
		fwrite($fp, chr(0xEF).chr(0xBB).chr(0xBF));
		fputcsv($fp,$title);
		$data = [
			['1','tom','2021-02'],
			['2','Mike','2021-03'],
			['3','Lily','2021-04'],
		];
		foreach($data as $key => $val){
     
			fputcsv($fp,$val); //fputcsv需要使用一维数组做为参数
		}
	}
	fclose($fp);
}

//方法2:  创建文件后以追加的方式写入数据,每次都会打开并关闭文件,会增加I/O操作,但是会减少文件的占用
function exportCsv2(){
     
	$title = ['id','name','time'];
	$file = date('Ymd').'_export.csv';
	file_put_contents($file,chr(0xEF).chr(0xBB).chr(0xBF));//添加BOM头,解决乱码问题
	file_put_contents($file,implode(',',$title).PHP_EOL,FILE_APPEND);//以追加方式写入
	$data = [
		['1','tom','2021-02'],
		['2','Mike','2021-03'],
		['3','Lily','2021-04'],
	];
	foreach($data as $key => $val){
     
		file_put_contents($file,implode(',',$title).PHP_EOL,FILE_APPEND);
	}
}

实际工作中可能会遇到需要发送邮件或异地下载的情况,可以先把文件上传到云环境(如果有的话),这样再下载就可以避免很多问题(如nginx跳转太多下载时间太长被断开,临时文件被清除的风险等等)

你可能感兴趣的:(php,导数据,csv,excel)