TP6.0 内存溢出 Allowed Memory Exhausted?使用生成器 Cursor 遍历

看不見的法師

看不見的法師

2026-07-09

608人浏览

原创

ThinkPHP 8.1.0
ThinkPHP 8.1.0

ThinkPHP 8.1.0 正式发布,深度优化路由与验证机制,完美兼容 PHP 8.4。本版本修复了数组路由配置异常,新增枚举值校验与高级数组验证功能,支持路由分类默认处理。作为高性能 PHP 框架的最新迭代,它延续了简洁实用的设计原则,提供更稳定的底层架构与更流畅的开发体验,助力开发者快速构建现代化 Web 应用与企业级系统。

下载
tp6无真正游标支持,需用生成器封装游标分页:确保排序字段有索引且唯一(如id),再通过where('id', '>', $lastid)分页拉取数据,每次仅加载一页并及时释放内存。

tp6.0 内存溢出 allowed memory exhausted?使用生成器 cursor 遍历

在ThinkPHP 6.0中处理百万级数据导出或批量任务时,直接调用select()chunk()极易触发“Allowed memory size exhausted”错误——这不是配置不够的问题,而是TP6底层未提供真正的游标(Cursor)支持,所有查询结果仍被完整加载进PHP内存所致。

为什么TP6没有真正的Cursor

ThinkPHP 6.x 的 Db 和 Model 层【不暴露 PDO 游标控制权】,所谓“Cursor遍历”实为误称。PDO 的 PDO::CURSOR_SCROLL 在 TP 中无法透出,MySQL 对其支持也极有限;即使声明了流式语义,fetch() 仍会将整结果集载入内存。官方文档里搜不到任何 cursor() 方法,所有自称支持 Cursor 的文章,实际都是手写 where('id', '>', $lastId) 模拟游标分页。

用生成器封装游标分页逻辑

这是TP6最稳、可调试、易落地的内存可控方案:把分页条件逻辑封装成生成器,每次只拉取一页数据,处理完立即释放内存。

第一步:确认排序字段有索引且唯一性足够——优先选自增 id,若用 created_at 必须加 id 复合去重,否则相同时间戳会导致漏数据或重复。

第二步:创建生成器函数,接收起始 $lastId 和每页数量 $size

function cursorPaginate($lastId = 0, $size = 1000) {<br>  while (true) {<br>    $list = Db::name('user_log')<br>      ->where('id', '      ->order('id DESC')<br>      ->limit($size)<br>      ->select();<br>    if ($list->isEmpty()) break;<br>    $lastId = $list->last()['id'];<br>    yield $list;<br>  }<br>}

第三步:用 foreach 遍历生成器,每页处理完后变量自动释放:

foreach (cursorPaginate(0, 500) as $page) {<br>  foreach ($page as $row) {<br>    // 处理单条记录,如写入文件、发送消息<br>  }<br>  // 此处 $page 自动销毁,内存立即回收<br>}

禁用 chunk() 的三个理由

方法一:chunk() 底层仍是多次 SELECT 全量加载,每批结果都完整驻留内存,不适合导出类场景。

方法二:chunk() 默认启用事务,大批量操作易锁表、拖慢数据库响应,且无法跳过已处理数据。

方法三:chunk() 不支持按非主键字段游标推进,一旦排序字段存在重复值,就会漏数据——而生成器+where分页可手动控制边界条件。

紧急情况下的 memory_limit 临时提升

方法1(CLI环境推荐):在PowerShell中执行,【双引号不可省】,否则 -1 会被当作命令参数截断:

php -d "memory_limit=-1" artisan export:users

方法2(Web环境可用):仅对当前脚本生效,需放在逻辑最开头,且不能高于 php.ini 硬上限:

ini_set('memory_limit', '512M');

注意:这只是救火手段,不能替代游标分页;若脚本已分配超400M内存,ini_set() 无法回收已占用部分。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

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

下载

相关标签:

thinkphp

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

相关专题

更多
marquee参数有哪些
marquee参数有哪些

marquee参数有direction、behavior、speed、scrolldelay、width、height、bgcolor、cursor、id、align、noresize、nohover、loopcount、bgcolorcolor、scrollamount和vspa。

2023.10.18

577

10

Cursor新手入门教程
Cursor新手入门教程

这是一份为新手量身定制的 Cursor 入门全流程指南。无论你是刚从 VS Code 迁移过来的老手,还是编程小白,这份指南都能帮你快速上手这款“代码自动驾驶仪”。

2026.04.09

48

10

Cursor 核心功能深度解析与实战技巧
Cursor 核心功能深度解析与实战技巧

本专题深度剖析 AI 代码编辑器 Cursor 的核心功能,涵盖 Composer 模式、codebase 索引、实时代码预测(Tab)及 Chat 交互等进阶用法。通过丰富的实战案例,手把手教你如何利用 Cursor 快速构建应用、重构复杂代码及进行自动化 Debug。

2026.04.16

112

10

Cursor 针对不同开发场景的使用教程
Cursor 针对不同开发场景的使用教程

本专题深度拆解 Cursor 在前端 UI 开发、后端重构、数据爬虫及自动化测试等 10+ 核心场景下的具体用法。详解如何针对不同业务场景配置特定的 .cursorrules,让 AI 真正深入你的业务逻辑。

2026.04.16

60

10

墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

3

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

1

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

4

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

3

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

0

10

热门下载

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

精品课程

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