PHP技术,轻松导出百万级CSV数据文件-csv文件怎么打开

PHP技术,轻松导出百万级CSV数据文件-csv文件怎么打开

做网站后台管理信息,经常会遇到数据导出excel,或者CSV的情况。

如果数据量大。导出会出异常或者直接中断,时间过长等。

下面给大家介绍一种百万级或以上的导出方法

/**
* 文章访问日志
* 下载的日志文件通常很大, 所以先设置csv相关的Header头, 然后打开
* PHP output流, 渐进式的往output流中写入数据, 写到一定量后将系统缓冲冲刷到响应中
* 避免缓冲溢出
*/
public function articleAccessLog($timeStart, $timeEnd)
{
set_time_limit(0);
$columns = [
'文章ID', '文章标题', ......
];
$csvFileName = '用户日志' . $timeStart .'_'. $timeEnd . '.xlsx';
//设置好告诉浏览器要下载excel文件的headers
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'. $fileName .'"');
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流中
$accessNum = '1000000'//从数据库获取总量,假设是一百万
$perSize = 1000;//每次查询的条数
$pages = ceil($accessNum / $perSize);
$lastId = 0;
for($i = 1; $i <= $pages; $i++) {
$accessLog = $logService->getArticleAccessLog($timeStart, $timeEnd, $lastId, $perSize);
foreach($accessLog as $access) {
$rowData = [
......//每一行的数据
];
mb_convert_variables('GBK', 'UTF-8', $rowData);
fputcsv($fp, $rowData);
$lastId = $access->id;
}
unset($accessLog);//释放变量的内存
//刷新输出缓冲到浏览器
ob_flush();
flush();//必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
}
fclose($fp);
exit();
}

方法很简单。导出现用户下载实时通讯。。

后面再发布一篇实时多进程处理导出百万级excel方法

推荐阅读