ThinkPHP 8.0 生成器(Generator)大数据导出【省内存】

阿静同学_4751

阿静同学_4751

2026-07-14

209人浏览

原创

thinkphp 8.0 导出百万级用户数据应使用生成器流式处理避免内存溢出:优先用 db::cursor(),次选原生 pdo yield,禁用调试、日志写文件及清理 schema 缓存。

thinkphp 8.0 生成器(generator)大数据导出【省内存】

ThinkPHP 8.0 中导出百万级用户数据时,内存瞬间飙到 512MB 并报错“Allowed memory size exhausted”,不是服务器配得低,而是你还在用 Db::select() 把整张表拖进内存再 foreach —— 这等于把长江水抽进玻璃杯,不炸才怪。

用生成器替代全量查询

第一步:改写数据获取逻辑,让数据库结果集按需吐出,而非一次性加载。

在控制器或服务类中,定义一个生成器方法:

public function userGenerator(): \Generator<br>{<br>  $sql = "SELECT id, name, email, created_time FROM user ORDER BY id";<br>  $pdo = $this->app->db->getPdo();<br>  $stmt = $pdo->prepare($sql);<br>  $stmt->execute();<br>  while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {<br>    yield $row;<br>  }<br>}

注意:必须用原生 PDO 的 unbuffered query(未缓冲查询),否则 fetch() 仍会预加载全部结果;ThinkPHP 默认的 Db::query() 是缓冲模式,不能直接 yield。

第二步:调用该生成器导出 CSV,每行处理完立即释放变量引用。

header('Content-Type: text/csv; charset=utf-8');<br>header('Content-Disposition: attachment; filename="users_' . date('YmdHis') . '.csv"');<br>$fp = fopen('php://output', 'wb');<br>fputcsv($fp, ['ID', '姓名', '邮箱', '注册时间']);<br>foreach ($this->userGenerator() as $user) {<br>  // 关键:避免在循环内拼接大字符串或存入数组<br>  fputcsv($fp, [$user['id'], $user['name'], $user['email'], $user['created_time']]);<br>  // 手动触发 GC 清理潜在残留(尤其含闭包或对象时)<br>  if (function_exists('gc_collect_cycles')) gc_collect_cycles();<br>}<br>fclose($fp);

ThinkPHP 原生支持的 Generator 封装方案

方法一:用 Db::cursor()(TP8.0+ 内置,推荐)

这是 ThinkPHP 8.0 官方提供的流式游标接口,底层已启用 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY = false,无需手写 PDO。

PHP
PHP

编写健壮的PHP代码,规避类型转换陷阱、数组怪癖及常见安全漏洞。

下载

$cursor = Db::table('user')<br>  ->field('id,name,email,created_time')<br>  ->order('id')<br>  ->cursor();<br>foreach ($cursor as $user) {<br>  fputcsv($fp, [$user['id'], $user['name'], $user['email'], $user['created_time']]);<br>}

【Db::cursor() 不支持 where 条件链式调用后直接加 ->limit()】——它只接受原始 SQL 或简单条件,复杂查询请改用原生 PDO + yield 方案。

方法二:封装成可复用的 Generator 工具类

新建 app/common/Generator.php

namespace app\common;<br>use think\facade\Db;<br>class Generator<br>{<br>  public static function fromQuery(string $sql, array $params = []): \Generator<br>  {<br>    $pdo = Db::getPdo();<br>    $stmt = $pdo->prepare($sql);<br>    $stmt->execute($params);<br>    while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {<br>      yield $row;<br>    }<br>  }<br>}

控制器中调用:foreach (Generator::fromQuery("SELECT * FROM user WHERE status = ?", [1]) as $u) { ... }

导出前必须关闭的三项配置

① 关闭 APP_DEBUG:.env 中设 APP_DEBUG=false,否则调试组件和 trace 日志会吃掉额外 80MB+ 内存。

② 禁用日志写文件:config/log.php 中将驱动改为 'type' => 'socket''type' => 'redis',避免高频 fputcsv 期间被 Log::info() 阻塞。

③ 清空 Schema 缓存并重生成:执行 php think schema:clear && php think schema:build,旧缓存可能残留冗余字段映射,导致 ORM 自动附加无关关联数据。

php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

thinkphp php 大数据

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3916

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1189

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

203

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

426

22

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

20

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

180

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

80

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

80

23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程