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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
php中关于普通表单多文件上传的处理方法
Mar 25 PHP
PHP的变量总结 新手推荐
Apr 18 PHP
php实现计数器方法小结
Jan 05 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
PHP中header用法小结
May 23 PHP
深入浅出讲解:php的socket通信原理
Dec 03 PHP
php删除数组指定元素实现代码
May 03 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 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
DedeCMS 核心类TypeLink.class.php摘要笔记
2010/04/07 PHP
用PHP实现Ftp用户的在线管理
2012/02/16 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
php常量详细解析
2015/10/27 PHP
php array_udiff_assoc 计算两个数组的差集实例
2016/11/12 PHP
PHP iconv()函数字符编码转换的问题讲解
2019/03/22 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
使Ext的Template可以解析二层的json数据的方法
2007/12/22 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
js自调用匿名函数的三种写法(推荐)
2016/08/19 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
nuxt静态部署打包相对路径操作
2020/11/06 Javascript
[07:59]2014DOTA2叨叨刀塔 林熊猫称被邀请赛现场盛况震撼
2014/07/21 DOTA
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
常见的在Python中实现单例模式的三种方法
2015/04/08 Python
Python CSV模块使用实例
2015/04/09 Python
python下MySQLdb用法实例分析
2015/06/08 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
django 中QuerySet特性功能详解
2019/07/25 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
倡议书格式及范文
2015/04/29 职场文书
2015党建工作简报
2015/07/21 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
mysql分表之后如何平滑上线详解
2021/11/01 MySQL