实时生成并下载大数据量的EXCEL文件,用PHP如何实现?

实时生成并下载大数据量的EXCEL文件,用PHP如何实现?,第1张

对于任何一个网站肯定是少不了下载功能,常见的下载功能有图片、视频、Excel表格,如果文件比较小的话,那么不会遇到任何的问题,但是当文件信息而超过了PHP的最大内存,那么在这个时候它就会有的内存溢出的问题。

那么它们是因为什么而发生的?对于这个过程的原理才是我们应该真正要去弄明白的事情

下载大数据量的EXCEL文件为何要报错?

PHP在下载大Excel表格的时候,那么首先它是需要去把MySQL的数据从硬盘上面读取到内存,但读取它是一次性载入到我们的内存,如果说它一次性载入的数据量远远大于最大内存,然后再来执行浏览器的业务下载。那么这个时候它就会发生我们这个内存溢出。

就比如:说我们现在有100M的数据量,但是我们PHP内存最大只有64M,那么这个它肯定是装不了的,我们可以把那个内存比喻为一个水杯,这个水杯的容量比喻为内存,现在杯子最大容量为64L。你要存放100L。肯定放不下

大事化小,小事化了。拆分成段

从上面可以看到文件下载,它是分为两步,首先是载入内存然后执行浏览器的输出下载,那么既然大型文件一次性载入不了,那可以采用“大事化小,小事化了”思路,我们可以实现边写边下载,也就是分批次的读取与写入。

因为用户的话,只要最终拿到这个文件就可以,对于浏览器的下载原理不需要关心。只需要给到文件下载提示给用户即可,然后后端在实时的分批次的写入到要下载的文件当中。

实现思路步骤:

1、一设置浏览器下载Excel需要的Header

2、打开php://output流,并设置写入文件句柄。

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

3、获取数据库所有数据量,并设置每次查询的条数,通过这两个值计算分批查询的次数

4、基于分批查询的次数循环查询数据库,然后写入到文件中,同时清除本次 *** 作变量内存,刷新缓冲到浏览器,让浏览器的文件始终实时保持到最新的大小

注:刷新用ob_flush、flush()

PHP的I/O流

在这里我们用到了PHP的一个IO的输入输出,也就是我们常用的

php://inputphp://output。

php://input

php://input可以读取原始的POST数据。相较于$form-data”.

注:p>

php://output是一个只写的数据流,允许你以print和echo一样的方式写入到输出缓冲区。

综上:实现思维与原理很重要如有感悟,欢迎在线咨询

file_put_contents只能生成文件在服务器上,无法读写客户端的文件系统,这是WEB的协议决定了的。

要想把file_put_contents生成在服务器上的文件发给浏览器用户,只有用下载的办法:文件生成到WEB可以访问的路径,然后使用<a href>建立链接让用户下载,示例代码:

file_put_contents('a.txt', $str)

echo '<a href=a.txt>下载文件</a>'

<?php

if(!empty($_POST['name'])){

header("Content-type:application/txt")

header("Content-Disposition:attachmentfilename='downloaded.txt'")

echo $_POST['name']exit

}

?>

<form action="" method="post">

<input type="text" name="name" />

<input type="submit" value="提交" />

</form>

php header()下载:http://hi-docs.com/php/header.html


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11602102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存