LOADING STUFF...

PHP实现实时生成并下载超大数据量的EXCEL文件详解

技术教程7小时前发布 北陌
11 0 0

PHP实现实时生成并下载超大数据量的EXCEL文件详解

前言

最近在工作中接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况。而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成超大数据量的excel文件时这显然是会造成内存溢出的,所以考虑使用让PHP边写入输出流边让浏览器下载的形式来完成需求。

我们通过如下的方式写入PHP输出流

$fp = fopen(php://output, a);
fputs($fp, strings);
….
….
fclose($fp)

php://output是一个可写的输出流,允许程序像操作文件一样将输出写入到输出流中,PHP会把输出流中的内容发送给web服务器并返回给发起请求的浏览器

另外由于excel数据是从数据库里逐步读出然后写入输出流的所以需要将PHP的执行时间设长一点(默认30秒)set_time_limit(0)不对PHP执行时间做限制。

注:以下代码只是阐明生成大数据量EXCEL的思路和步骤,并且在去掉项目业务代码后程序有语法错误不能拿来直接运行,请根据自己的需求填充对应的业务代码!

/**
* 文章访问日志
* 下载的日志文件通常很大, 所以先设置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

© 版权声明

相关文章

暂无评论

暂无评论...