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 相关文章推荐
thinkphp 多表 事务详解
Jun 17 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
php遍历目录方法小结
Mar 10 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
Nov 15 PHP
PHP远程调试之XDEBUG
Dec 29 PHP
Zend Framework动作助手Url用法详解
Mar 05 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 PHP
php实现小程序支付完整版
Oct 09 PHP
php经典趣味算法实例代码
Jan 21 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
Jul 08 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
php 攻击方法之谈php+mysql注射语句构造
2009/10/30 PHP
JS 网站性能优化笔记
2011/05/24 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
js截取函数(indexOf,join等)
2010/09/01 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
windows下vue-cli及webpack搭建安装环境
2017/04/25 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
node.js到底要不要加分号浅析
2018/07/11 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
详解使用element-ui table组件的筛选功能的一个小坑
2018/11/02 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
微信小程序实现下拉加载更多商品
2020/12/29 Javascript
详解Python中的装饰器、闭包和functools的教程
2015/04/02 Python
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
Python turtle画图库&&画姓名实例
2020/01/19 Python
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
普天C++笔试题
2016/03/20 面试题
护士自荐信怎么写
2013/10/18 职场文书
任命书怎么写
2014/06/04 职场文书
应聘会计求职信
2014/06/11 职场文书
学前班教学反思
2016/02/24 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
Python集合set()使用的方法详解
2022/03/18 Python
Python 图片添加美颜效果
2022/04/28 Python