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 相关文章推荐
《APMServ 5.1.2》使用图解
Oct 23 PHP
PHP添加MySQL数据记录代码
Jun 07 PHP
php 方便水印和缩略图的图形类
May 21 PHP
php 注释规范
Mar 29 PHP
ThinkPHP中的关联模型注意点
Jun 16 PHP
浅析ThinkPHP的模板输出功能
Jul 01 PHP
php版微信公众平台接口参数调试实现判断用户行为的方法
Sep 23 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 PHP
PHP优化之批量操作MySQL实例分析
Apr 23 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实现服务器状态监控的方法
2014/12/09 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
使用BootStrap实现悬浮窗口的效果
2016/12/13 Javascript
js常用DOM方法详解
2017/02/04 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
详解为生产环境编译Angular2应用的方法
2018/12/10 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
微信小程序实现吸顶效果
2020/01/08 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
基于JavaScript实现随机点名器
2021/02/25 Javascript
python 写入csv乱码问题解决方法
2016/10/23 Python
对Python中小整数对象池和大整数对象池的使用详解
2019/07/09 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
Python同时处理多个异常的方法
2020/07/28 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
纬创Java面试题笔试题
2014/10/02 面试题
行政人员岗位职责
2013/12/08 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2015高考寄语集锦
2015/02/27 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
python 模拟在天空中放风筝的示例代码
2021/04/21 Python