主页 > TokenPocket下载 > 「TokenPocket钱包官网」PHP怎么实现实时生成并下载超大数据量的EXCEL文件

「TokenPocket钱包官网」PHP怎么实现实时生成并下载超大数据量的EXCEL文件

admin TokenPocket下载 2022年07月08日
$fp = fopen('php://output', 'a'); fputs($fp, 'strings'); .... .... fclose($fp)

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

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

本文主要介绍"PHP怎么实现实时生成并下载超大数据量的EXCEL文件",希望能够解决您遇到有关问题,下面我们一起来看这篇 "PHP怎么实现实时生成并下载超大数据量的EXCEL文件" 文章。

下一节:基于php流程控制语句和循环控制语句如何用PHP编程技术

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

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

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

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

关于 "PHP怎么实现实时生成并下载超大数据量的EXCEL文件" 就介绍到这。希望大家多多支持编程宝库。

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

基于php流程控制语句和循环控制语句怎么用:本文主要介绍"基于php流程控制语句和循环控制语句如何用",希望能够解决您遇到有关问题,下面我们一起来看这篇 "基于php流程控制语句和循环控制语句如何用" 文章。1、流程控制语句主要有if、ii ...

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

前言

广告位
标签: php   编程宝库   程序设计   excel   编程