news 2026/8/28 13:37:57

Yii2.0网站数据有5万条,批量导出excel

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Yii2.0网站数据有5万条,批量导出excel

首先,我们先了解导出大数据量到Excel时可能遇到的问题。当我们试图一次性从数据库中取出大量数据(如5万条记录)并直接导出到Excel时,可能会因为数据处理量大而导致脚本执行时间过长,进而触发PHP的最大执行时间限制,出现超时错误。

为了解决这个问题,我们可以采用以下策略:

  1. 分批处理:不要一次性从数据库中取出所有数据,而是分批取出,每批处理一定数量的记录。
  2. 直接输出:在取数据的同时,直接将数据写入Excel文件并输出,而不是先全部存入内存再输出。
  3. 关闭输出缓冲:关闭PHP的输出缓冲,确保数据实时输出到浏览器。

现在,我们使用PHPExcel或PhpSpreadsheet(PHPExcel的继任者)这样的库来生成Excel文件。以下是使用PhpSpreadsheet进行大数据量导出的简单示例:

<?php require 'vendor/autoload.php'; // 引入PhpSpreadsheet库 use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet->getActiveSheet(); // 设置表头 $sheet->setCellValue('A1', 'ID'); $sheet->setCellValue('B1', 'Name'); $sheet->setCellValue('C1', 'Email'); // ... 其他表头 $row = 2; // 从第二行开始写入数据 $batchSize = 1000; // 每次从数据库取出的记录数 $offset = 0; // 偏移量,用于分批取出数据 // 连接数据库(这里以PDO为例) $pdo = new PDO('mysql:host=localhost;dbname=your_database', 'username', 'password'); while (true) { $stmt = $pdo->prepare("SELECT * FROM your_table LIMIT :offset, :batchSize"); $stmt->bindParam(':offset', $offset, PDO::PARAM_INT); $stmt->bindParam(':batchSize', $batchSize, PDO::PARAM_INT); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); if (empty($results)) { break; // 如果没有更多数据,则退出循环 } foreach ($results as $result) { $sheet->setCellValue('A' . $row, $result['id']); $sheet->setCellValue('B' . $row, $result['name']); $sheet->setCellValue('C' . $row, $result['email']); // ... 设置其他单元格的值 $row++; } $offset += $batchSize; // 更新偏移量,以便下次取出下一批数据 } // 设置HTTP响应头,以便浏览器下载文件而不是显示内容 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="data.xlsx"'); header('Cache-Control: max-age=0'); $writer = new Xlsx($spreadsheet); $writer->save('php://output'); // 直接输出到浏览器,不保存到服务器磁盘上 ?>

底层原理

  1. 分批处理:我们使用了LIMITOFFSET在SQL查询中来分批获取数据,这样不会一次性加载所有数据到内存中。
  2. 直接输出:通过php://output,我们直接将Excel文件的内容输出到浏览器,而不需要先将其保存为文件再提供下载。这减少了服务器的磁盘I/O操作。
  3. HTTP响应头:通过设置响应头,我们告诉浏览器这是一个文件下载请求,而不是一个普通的网页请求。这样,浏览器会提示用户保存文件,而不是在浏览器中显示文件内容。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 13:36:57

安全帽检测数据集VOC/YOLO格式解析与YOLOv8实战训练指南

简介&#xff1a;目标检测是计算机视觉的核心任务&#xff0c;其原理是通过算法在图像中定位并识别出感兴趣的目标。这项技术在工业自动化、智能安防等领域具有极高的技术价值&#xff0c;是实现智能化监管的关键。在智慧工地、安全生产等应用场景中&#xff0c;安全帽佩戴检测…

作者头像 李华
网站建设 2026/8/28 13:36:19

JWT的Token可以被撤销吗?

JWT的Token可以被撤销吗&#xff1f;JWT&#xff08;JSON Web Token&#xff09;本身并没有内置的撤销机制。一旦JWT被签发&#xff0c;它就会在有效期内一直有效&#xff0c;除非它的有效期&#xff08;exp声明&#xff09;到期。但是&#xff0c;有一些方法可以实现JWT的撤销…

作者头像 李华
网站建设 2026/8/28 13:35:56

Open WebUI 部署指南:新手 5 分钟跑通本地 AI 对话界面

Open WebUI 部署指南&#xff1a;新手 5 分钟跑通本地 AI 对话界面 【免费下载链接】open-webui User-friendly AI Interface (Supports Ollama, OpenAI API, ...) 项目地址: https://gitcode.com/GitHub_Trending/op/open-webui Open WebUI 是一个自托管的 AI 对话界面…

作者头像 李华
网站建设 2026/8/28 13:33:48

微调模型如何扛住真实场景?拆解Omega-S功能韧性评估框架

拿到一个微调后的LLM&#xff0c;最常见的行为是什么&#xff1f;不是上线&#xff0c;而是先跑一遍评测集。分数不错&#xff0c;大家松一口气&#xff0c;然后一放到真实场景里&#xff0c;用户稍微换几个说法&#xff0c;模型就开始答非所问、格式错乱、甚至完全偏离任务。O…

作者头像 李华
网站建设 2026/8/28 13:33:43

Kali 更换源(超详细,附国内优质镜像源地址)

进入管理员下的控制台。 输入密码后点击“授权”。 在控制台内输入下面的内容。 vim /etc/apt/sources.list敲击回车后会进入下面的页面。 来到这个页面后的第一部是按键盘上的“i”键&#xff0c;左下角出现“插入”后说明操作正确。 使用“#”将原本的源给注释掉。 从下面的…

作者头像 李华
网站建设 2026/8/28 13:32:46

从OpenAI Build Week看Codex:AI编程进入Agent工程管理时代

如果你最近在看 AI 编程、Agent 工具链相关的内容&#xff0c;大概率刷到过 OpenAI Build Week 的消息。每次 OpenAI 办完这类黑客松活动&#xff0c;总能看到一堆参会者晒项目、晒 Demo、晒奖杯。很多人第一反应是看热闹&#xff1a;谁拿了第一名、项目长什么样、奖品是什么。…

作者头像 李华