通过phpexcel导出上万条数据,会延迟、内存溢出、程序报错,各种问题出现...届时作者放弃了phpexcel,导出小数据量还是很可行的。下面通过分批导出csv,并压缩至zip中提供下载...废话不说上代码...部分代码参考网上的哦~~~
/** * csv 批量导出 * @param $mpid * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */public function export($mpid){ $wechat_mp_model = new WechatMp(); $limit = 50000;//每次只从数据库取50000条以防变量缓存太大 // buffer计数器 $cnt = 0; $where['mpid'] = $mpid; $mpName = $wechat_mp_model->getCustomField($where, 'mpname'); $start_time = $this->request->param('start_time', ''); $end_time = $this->request->param('end_time', ''); $args['start_time'] = $start_time; $args['end_time'] = $end_time; $xlsTitle = ['关注时间', '微信Openid', '微信昵称', '微信头像', '性别']; set_time_limit(0); $sqlCount = $this->get_fans_list($mpid, 0, $limit, $args, true); $fileName = iconv('utf-8', 'gb2312', $mpName);//文件名称 $fileName = $fileName . date('_YmdHis');// 文件名称可根据自己情况设定 // 输出Excel文件头,可把user.csv换成你要的文件名 header('Content-Type: application/vnd.ms-excel;charset=utf-8'); header('Content-Disposition: attachment;filename="' . $fileName . '"'); header('Cache-Control: max-age=0'); $fileNameArr = array(); // 逐行取出数据,不浪费内存 for ($i = 0; $i < ceil($sqlCount / $limit); $i++) { $fp = fopen($fileName . '_' . $i . '.csv', 'w'); //生成临时文件 // chmod('attack_ip_info_' . $i . '.csv',777);//修改可执行权限 $fileNameArr[] = $fileName . '_' . $i . '.csv'; // 将数据通过fputcsv写到文件句柄 fputcsv($fp, $xlsTitle); $start = $i * $limit; $dataArr = $this->get_fans_list($mpid, $start, $limit, $args); foreach ($dataArr as $a) { $cnt++; if ($limit == $cnt) { //刷新一下输出buffer,防止由于数据过多造成问题 ob_flush(); flush(); $cnt = 0; } fputcsv($fp, $a); } fclose($fp); //每生成一个文件关闭 } //进行多个文件压缩 $zip = new \ZipArchive(); $filename = $fileName . ".zip"; $zip->open($filename, $zip::CREATE); //打开压缩包 foreach ($fileNameArr as $file) { $zip->addFile($file, basename($file)); //向压缩包中添加文件 } $zip->close(); //关闭压缩包 foreach ($fileNameArr as $file) { unlink($file); //删除csv临时文件 } $this->insertLog($this->admin_id, '', '导出公众号粉丝'); //输出压缩文件提供下载 header("Cache-Control: max-age=0"); header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename=' . basename($filename)); // 文件名 header("Content-Type: application/zip"); // zip格式的 header("Content-Transfer-Encoding: binary"); // header('Content-Length: ' . filesize($filename)); // @readfile($filename);//输出文件; unlink($filename); //删除压缩包临时文件}
目前本机没有百万数据,也就30万条左右,导出没有任何问题,而且效率杠杠的。大家在使用过程中有更好的建议,欢迎留言!!