使用 pdo 和mysql i 的游标功能可实现 数据库 大数据 量下的低内存逐行处理。首先通过 PDO 设置 PDO::MYSQL_ATTR_USE_BUFFEred_QUERY 为 false,结合 fetch()方法逐行读取;或使用 mysqli 的 query()配合 MYSQLI_USE_RESULT 模式执行未缓冲查询,再用 fetch_assoc()循环 获取数据,并需调用 free_result()释放资源;进一步结合 php 生成器,封装 游标查询为 Generator对象 ,利用 yield 逐次返回单行数据,使 内存占用 保持在较低水平,适用于大规模数据流式处理场景。

当您需要从数据库中读取大量数据并逐行处理时,直接加载全部结果集可能导致内存溢出。使用游标可以有效降低内存消耗,实现高效的数据流式处理。以下是 PHP 中利用游标逐行处理数据库数据的方法。
本文运行环境:macBook Pro,macOS Sonoma
一、使用 PDO 游标模式
PDO 提供了对游标的原生支持,通过设置语句的获取模式为游标类型,可实现逐行读取数据。
1、创建 PDO 连接,并禁用预取以启用服务器 端游 标。
立即学习“PHP 免费学习笔记(深入)”;
将 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 属性设为 false,确保查询不缓存全部结果。
2、执行 select 语句后,使用 while 循环配合 fetch()方法逐行获取记录。
3、每处理完一行数据后,自动释放当前行资源,避免内存累积。
二、使用 MySQLi 未缓冲查询
MySQLi 扩展允许执行未缓冲查询,使得结果集在客户端不被完整存储,适合 大数据 量场景。
1、建立 MySQLi 连接后,调用 query()方法并传入第二个参数 MYSQLI_USE_RESULT 以启动未缓冲模式。
2、使用 fetch_assoc()或 fetch_array()方法循环读取每一行数据。
3、必须在处理完毕后调用 free_result()显式释放结果集资源。
三、结合生成器实现内存友好型迭代
PHP 的生成器能将游标封装成可遍历对象,在保持低 内存占用 的同时提供简洁的语法结构。
1、定义一个返回 Generator 类型的方法,内部使用 PDO 或 MySQLi 进行未缓冲查询。
2、在循环中每次 yield 返回单行数据,外部可通过 foreach 消费该生成器。
3、生成器函数会在每次 yield 后暂停执行,直到下一次迭代请求,极大减少内存压力。


