php查询mysql大量数据造成内存不足的解决方法


Posted in PHP onMarch 04, 2015

本文实例分析了php查询mysql大量数据造成内存不足的解决方法。分享给大家供大家参考。具体分析如下:

一、问题

使用php查询mysql大数据量的时候,程序尚未执行完毕,跳出警告:
Fatal error:  Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes)
错误提示:php所分配到的100M内存被占用完毕。

二、解决方法:

最简单的解决办法是:在执行文件的头部增加:

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

把内存增加到256M或者更多,可以增大php所使用的内存空间
但是下次若要读取更多的数据该怎么办呢,总不能一次次的增加,导致服务器的内存都被php吃光。

这里介绍一个函数:

使用memory_get_usage()方法获得php使用的内存量。发现随着读取数据条数的增加,php使用的内存在一步步增加。
难道php在查询mysql时的数据是存在内存中的?搜索了一下,发现果真大概就是这个意思。
mysql的C API函数有mysql_use_result()和mysql_store_result()
mysql_store_result()会把结果集从mysqlServer读到客户端,而 mysql_use_result()只是读取了结果集的元信息

1、php的mysql_query调用的是mysql_store_result(),自动获取并缓存结果集
2、而php的另一个函数mysql_unbuffered_query()则是调用的 mysql_use_result(),一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。

所以我们在读取大量数据的时候,可以使用mysql_unbuffered_query()来替代mysql_query()。经测试,的确如此。而且相当给力,导完所有数据内存一直保持在1MB以内,没有增长过
mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query,但不像 mysql_query()那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier。
mysql_unbuffered_query()的好处是有代价的:在 mysql_unbuffered_query()返回的结果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。
所以一定要结合自己的业务需求适当的选取函数

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
基于mysql的论坛(7)
Oct 09 PHP
有关 PHP 和 MySQL 时区的一点总结
Mar 26 PHP
PHP中防止SQL注入实现代码
Feb 19 PHP
php中计算未知长度的字符串哪个字符出现的次数最多的代码
Aug 14 PHP
php打开远程文件的方法和风险及解决方法
Nov 12 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
php判断当前用户已在别处登录的方法
Jan 06 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
PHP命名空间namespace的定义方法详解
Mar 29 PHP
laravel学习笔记之模型事件的几种用法示例
Aug 15 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
Apr 10 PHP
TP5框架实现自定义分页样式的方法示例
Apr 05 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 #PHP
PHP获取POST数据的几种方法汇总
Mar 03 #PHP
php函数实现判断是否移动端访问
Mar 03 #PHP
php中instanceof 与 is_a()区别分析
Mar 03 #PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 #PHP
ecshop 2.72如何修改后台访问地址
Mar 03 #PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
Mar 03 #PHP
You might like
mysql数据库差异比较的PHP代码
2012/02/05 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
js实现简单模态窗口,背景灰显
2008/11/14 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
2016/01/14 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
[57:24]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
从零学Python之hello world
2014/05/21 Python
Python正则表达式匹配HTML页面编码
2015/04/08 Python
Python导入模块时遇到的错误分析
2017/08/30 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
2017/11/29 Python
python K近邻算法的kd树实现
2018/09/06 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
Python中bisect的用法及示例详解
2020/07/20 Python
美国珠宝店:Helzberg Diamonds
2018/10/24 全球购物
灵泰克Java笔试题
2016/01/09 面试题
酒店前台接待岗位职责
2013/12/03 职场文书
自我鉴定书面格式
2014/01/13 职场文书
社区食品安全实施方案
2014/03/28 职场文书
效能监察建议书
2014/05/19 职场文书
通信工程求职信
2014/07/16 职场文书
索赔员岗位职责
2015/02/15 职场文书
门球健将观后感
2015/06/16 职场文书
为什么说餐饮很难做,是因为你不了解这些新规则
2019/08/20 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP