一般处理大数据有如下几种解决办法: 通过添加或者修改事件触发脚本,生成数据;定时任务执行脚本生成数据;直接使用phpexcel导出大量数据;采用fputcsv实时数据流方式写入。用一张图表示如下:
这里主要记录下使用fputcsv方式导出数据。
public function exportdata() { set_time_limit(0); ini_set('memory_limit', '1024m'); $columns = [ '列名1', '列名2', '列名3' //需要几列,定义好列名 ]; //设置好告诉浏览器要下载excel文件的headers header('content-description: file transfer'); header('content-type: application/vnd.ms-excel'); header('content-disposition: attachment; filename="导出数据-'.date('y-m-d', time()).'.csv"'); header('expires: 0'); header('cache-control: must-revalidate'); header('pragma: public'); $fp = fopen('php://output', 'a');//打开output流 mb_convert_variables('gbk', 'utf-8', $columns); fputcsv($fp, $columns);//将数据格式化为csv格式并写入到output流中 //添加查询条件,获取需要的数据 $query = model::class()->where(); //获取总数,分页循环处理 $accessnum = $query->count(); $persize = 1000; $pages = ceil($accessnum / $persize); for($i = 1; $i <= $pages; $i++) { $db_data = $query->limit($persize)->offset(($i-1)*$persize)->get(); foreach($db_data as $key => $value) { $rowdata = []; //获取每列数据,转换处理成需要导出的数据 //需要格式转换,否则会乱码 mb_convert_variables('gbk', 'utf-8', $rowdata); fputcsv($fp, $rowdata); } //释放变量的内存 unset($db_data); //刷新输出缓冲到浏览器 ob_flush(); //必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 flush(); } fclose($fp); exit(); }
这样会一边生成,一边写入下载文件,提高处理速度。
之前使用的包处理,生成一个25m的数据,要20分钟。这种方式处理需要1分多钟(也和实际处理的环境有关)。
相关推荐:
php csv大量数据导出分割处理
php导入大量数据到mysql(示例)
以上就是php中导出大量数据的实现方法的详细内容。
