当前位置: 首页 > 编程日记 > 正文

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文件的headersheader('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();}

好了, 其实很简单,就是用逐步写入输出流并发送到浏览器让浏览器去逐步下载整个文件,由于是逐步写入的无法获取文件的总体size所以就没办法通过设置header("Content-Length: $size");在下载前告诉浏览器这个文件有多大了。不过不影响整体的效果这里的核心问题是解决大文件的实时生成和下载。


更新: 说一下我数据库查询这里的思路,因为逐步写入EXCEL的数据实际上来自Mysql的分页查询,大家知道其语法是LIMIT offset, num 不过随着offset越来越大Mysql在每次分页查询时需要跳过的行数就越多,这会严重影响Mysql查询的效率(包括MongoDB这样的NoSQL也是不建议skip掉多条来取结果集),所以我采用LastId的方式来做分页查询。 类似下面的语句:

SELECT columns FROM `table_name` 
WHERE `created_at` >= 'time range start' 
AND `created_at` <= 'time range end' 
AND  `id` < LastId 
ORDER BY `id` DESC 
LIMIT num 

相关文章:

小学三年级上册计算机计划书,小学三年级班主任工作计划书

教学计划是教师个人制定的工作计划&#xff0c;通常为一个学期&#xff0c;内容主要包括制定教学计划的指导思想、教学内容以及教学目标&#xff0c;最重要的是每个教师要针对自己所带的学生特点来制定计划&#xff0c;因材施教才是对我们学生最好的教育.一、指导思想端正学习态…

10行代码爬取全国所有A股/港股/新三板上市公司信息

参加 2018 AI开发者大会&#xff0c;请点击 ↑↑↑作者 | 高级农民工本文已获原作者授权&#xff0c;如需转载&#xff0c;请联系原作者。摘要&#xff1a; 我们平常在浏览网页中会遇到一些表格型的数据信息&#xff0c;除了表格本身体现的内容以外&#xff0c;可能还想透过表格…

阿里云前端周刊 - 第 29 期

推荐 1. RESTful API 设计最佳实践 https://blog.philipphauer.de/... 项目资源的URL应该如何设计&#xff1f;用名词复数还是用名词单数&#xff1f;一个资源需要多少个URL&#xff1f;用哪种HTTP方法来创建一个新的资源&#xff1f;可选参数应该放在哪里&#xff1f;那些不涉…

Flash传值给asp页面

1.LoadVars的load方法&#xff0d;&#xff0d;&#xff0d;&#xff0d;&#xff0d;在flash中写一个拉出两个动态文件框&#xff0c;变量名为myName与myPsd&#xff0c;拉出一组件button&#xff0c;名为&#xff1a;submit_button&#xff0c;用于提交&#xff0c;再拉出一T…

《深度学习500问》,川大优秀毕业生的诚意之作

前端工程师掌握这18招&#xff0c;就能在浏览器里玩转深度学习基于知识图谱的人机对话系统 | 公开课笔记来呀&#xff01;AI喊你斗地主美团大脑&#xff1a;知识图谱的建模方法及其应用 | 公开课笔记60天,4位诺奖得主,他们将这样改造区块链程序员的江湖&#xff0c;务必掌握这些…

UC阿里鱼卡全网免流活动正在进行

UC&阿里鱼卡全网免流活动正在进行 优酷、虾米、高德、书旗应用专属流量免费 赠送100分钟国内通话、1G全国流量 扫码立即免费申请

普渡大学计算机硕士申请条件,普渡大学计算机与信息技术理学硕士研究生申请要求及申请材料要求清单...

2020年普渡大学计算机与信息技术理学硕士申请要求及普渡大学计算机与信息技术理学硕士申请材料要求清单是学生很感兴趣的问题&#xff0c;下面指南者留学整理2020年普渡大学计算机与信息技术理学硕士研究生申请要求及申请材料要求清单供大家参考。其中包括2020年普渡大学计算机…

object.ReferenceEquals(a,b)

code1 Assert.IsFalse(object.ReferenceEquals(10, 10));//比较时&#xff0c;要把比较的东西Box成Object&#xff0c;二个Ojbec地址是不一样的。 2 3 int value 10; 4 object one value; 5 object two value; 6 As…

深度文本匹配在智能客服中的应用

参加2018 AI开发者大会&#xff0c;请点击↑↑↑作者 | 云知声目录一. 深度文本匹配的简介1. 文本匹配的价值2. 深度文本匹配的优势3. 深度文本匹配的发展路线二. 智能客服的简介1. 智能客服的应用背景2. 智能客服的核心模块FAQ 库的构建语义召回相似度模型模型更新三. 深度文本…

计算机辅助焊接过程控制,重型车辆计算机辅助焊接工艺自动设计系统.pdf

金属学与金属工艺维普资讯第26卷 第10期 焊 接 学 报 v。1&#xff0e;26 N。&#xff0e;102005年 10月 TRANSACTIONSOFTHECHINAWELDINGINSTITUTION October 2005重型车辆计算机辅助焊接工艺 自动设计系统王克鸿&#xff0c; 韩 杰&#xff0c; 李 帅 王佳军(南京理工大学 材料…

Linux--文件管理以及权限的修改

一、文件属性查看ls -l filename 目录属性的大小&#xff08;文件名的字符总和&#xff09;-|rw-r--r--.|1| root| root| 46 |Oct 1 05:03 |filename— ————————— — ———— ———— —— ———————————— ———————— 1 …

Linux 之父归来!

参加2018 AI开发者大会&#xff0c;请点击↑↑↑作者 | 屠敏来源 | CSDN去修身养性的 Linux 之父 Linus Torvalds 在时隔一个余月后笑着归来&#xff0c;从曾临时接手 Linux 4.19 开发的稳定版维护者 Greg Kroah-Hartman 手中再次接过 Linux 内核开发的交接棒。这位向来天不怕地…

vscode断开调试服务器文件,vscode显示等待调试器断开连接

我正在尝试在vscode上调试量角器脚本。我编辑了launch.json文件,但是调试控制台抛出了下面的错误。vscode调试控制台输出:C:\Program Files\nodejs\node.exe --inspect-brk45448 conf.js C:\Users\abc\AppData\Roaming\npm\node_modules\protractor\example/conf.jsDebugger li…

深入理解Spring系列之六:bean初始化

《深入理解Spring系列之四&#xff1a;BeanDefinition装载前奏曲》中提到&#xff0c;对于非延迟单例bean的初始化在finishBeanFactoryInitialization(beanFactory)中完成。进入这个方法&#xff0c;代码如下。protected void finishBeanFactoryInitialization(ConfigurableLis…

webkit内核 css,纯CSS改变webkit内核浏览器的滚动条样式

基于webkit的浏览器现在可以自定义其滚动条的样式了&#xff0c;实现代码如下&#xff1a;复制代码代码如下:::-webkit-scrollbar/*整体部分*/{width: 10px;height:10px;}::-webkit-scrollbar-track/*滑动轨道*/{-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);border-rad…

数据依赖症:当今AI领域的核心风险

在最近结束的2017年度AI星际争霸竞赛上&#xff0c;Facebook做出了一款人工智能“CherryPi”&#xff0c;参与到这项旨在让各路AI技术在星际争霸游戏中同场竞技的赛事之中。 但很遗憾的是&#xff0c;Facebook仅仅获得了赛事的第六名&#xff0c;最直接的原因&#xff0c;在于F…

1024程序员节,你是我们要找的那条锦鲤吗?

参加2018 AI开发者大会&#xff0c;请扫描海报二维码 叮咚&#xff0c;您有一封 #1024吐槽狂欢派对# 邀请函请查收。 ▌什么是程序员&#xff1f; 全员格子、黑框眼镜&#xff0c;还是等于创造力忍耐力&#xff1f; 刻板标签、思维定式&#xff0c;还是高阶自黑玩梗幽默&#…

虚拟机管理你的服务器,全面解析VMware的虚拟机管理解决方案

本教程将为你讲述VMware的虚拟机管理解决方案&#xff0c;说起虚拟机&#xff0c;VMware绝对可以算的上是个中翘楚了&#xff0c;并且VMware的虚拟桌面结构解决方案可以起到增强管理效率&#xff0c;降低成本等等效用&#xff0c;话不多说&#xff0c;这就为大家介绍。Vmware的…

针对抓win2003系统密码的诡计

命令行下卸载win2003 sp1/sp2 %systemroot%\$NtServicePackUninstall$\spuninst\spuninst /U 按无人参与模式删除 service pack。如果使用此选项&#xff0c;那么在卸载 SP1 的过程中&#xff0c;只有出现致命错误才会显示提示。 /Q 按安静模式删除 SP1&#xff0c;此模式与无人…

那个曾经为美国NASA开发火星大脑的AI公司,现在和华为合作了

2010 年&#xff0c;美国航天航空局 NASA 敲响了一家创业公司的大门&#xff0c;希望他们参与火星探测器“大脑”的研发项目。这家公司就是 Neurala&#xff0c;一家专注于深度学习技术的波士顿初创公司。 NASA 的要求是一个艰难的挑战&#xff0c;因为火星探测器自身计算能力…

艾伦人工智能研究院开源AllenNLP,基于PyTorch轻松构建NLP模型

艾伦人工智能研究院&#xff08;AI2&#xff09;开源AllenNLP&#xff0c;它是一个基于PyTorch的NLP研究库&#xff0c;利用深度学习来进行自然语言理解&#xff0c;通过处理低层次的细节、提供高质量的参考实现&#xff0c;能轻松快速地帮助研究员构建新的语言理解模型。 Alle…

3650服务器性能,全新联想System x3650 M4服务器性能出色

系统支持Microsoft Windows Server 2008 R2Microsoft Windows Server 2008&#xff0c;Datacenter x64 EditionMicrosoft Windows Server 2008&#xff0c;Datacenter x86 EditionMicrosoft Windows Server 2008&#xff0c;Enterprise x64 EditionMicrosoft Windows Server 20…

不只翻译机,搜狗将在半年内推数款智能硬件产品

10月24日已是昨日&#xff0c;但属于开发者的1024一直都在——2018 AI开发者大会就是你的1024。11月8-9日&#xff0c;现场聆听国内外AI大牛的深知灼见&#xff0c;与工业界AI应用思维紧密同步&#xff0c;收获60技术大咖的干货分享。扫码填写大会注册信息表&#xff0c;就有可…

Windows Embedded Standard开发初体验(四)

添加文件、依赖组件、注册表 接下来我们就要进入创建组件最重要的一环了&#xff0c;添加文件。为什么说重要&#xff0c;因为这里有一个大坑&#xff0c;我在Windows Embedded Standard产品组施卫娟老师的指导下&#xff0c;花了两周的时间才勉强爬出来&#xff0c;可见该坑之…

Windows 2003 + ISA 2006+单网卡×××配置(4)

&#xff08;接上&#xff09;图13 然后下一步&#xff0c;用户集默认所有用户&#xff0c;不用改变&#xff0c;直接下一步&#xff0c;完成&#xff0c;然后会出现如图14图14照样还是点击应用。。。好了&#xff0c;都配置完了&#xff0c;下面我们做个测试。。。我本机的IP地…

科大讯飞全新1024:3大计划,200项A.I.能力,全链路驱动应用场景创新!

10月24日&#xff0c;2018届科大讯飞全球1024开发者节在合肥奥林匹克体育中心综合馆如约举行&#xff0c;重磅发布了全新升级的科大讯飞《1024计划》&#xff01;原中国科学技术部副部长张来武、科大讯飞董事长刘庆峰、科大讯飞轮值总裁胡郁、讯飞听见事业部总经理王玮分别发表…

SQL基本语句

掌握SQL四条最基本的数据操作语句&#xff1a;Insert&#xff0c;Select&#xff0c;Update和Delete。练掌握SQL是数据库用户的宝贵财 富。在本文中&#xff0c;我们将引导你掌握四条最基本的数据操作语句—SQL的核心功能—来依次介绍比较操作符、选择断言以及三值逻辑。当你完…

【TP3.2】路由匹配和规则

TP3.2框架的路由匹配和规则处理&#xff1a; 包括&#xff1a;静态路由&#xff0c;动态路由&#xff0c;多参数路由、正则路由 <?php return array(//配置项>配置值/* * 路由开启和匹配。首先开启路由匹配&#xff0c;然后根据相应的路由规则进行匹配* 1、静态路由* 2、…

soul一直显示正在登录聊天服务器,soul这个软件,为什么有些人在玩的时间很久以后(两百天以上),就不会再主动和其他人打招呼了?...

起首&#xff0c;说一下我本人接触soul的那些年。记得玩soul是17年开端&#xff0c;最初这个软件的营销目标是为了让人们更好地交换&#xff0c;停止跨时空的深度聊天&#xff0c;寻求魂魄的朋友&#xff0c;而不是皮郛的一时好感。可能说当时soul是打着"丢脸的皮郛千篇一…

构建插件式的应用程序框架(八)----视图服务的简单实现(ZT)

我在前一篇文章里提到&#xff0c;对于停靠工具栏或者是视图最好是不要将实例放到词典中&#xff0c;而是将工具栏或者视图的类型放到词典中&#xff0c;因为视图类型会经常的被重用&#xff0c;并且会经常被关闭或者再打开。当实例被关闭后&#xff0c;资源就被释放了&#xf…