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 相关文章推荐
PHP的面试题集,附我的答案和分析(一)
Nov 19 PHP
PHP程序员基本要求和必备技能
May 09 PHP
PHP return语句的另一个作用
Jul 30 PHP
浅谈PHP中output_buffering
Jul 13 PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
Jan 09 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
详谈PHP面向对象中常用的关键字和魔术方法
Feb 04 PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
PHP 爬取网页的主要方法
Jul 13 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
Oct 15 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
全国FM电台频率大全 - 19 广东省
2020/03/11 无线电
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
ThinkPHP中实例Model方法的区别说明
2010/08/21 PHP
PHP一个简单的无需刷新爬虫
2019/01/05 PHP
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
JavaScript新增样式规则(推荐)
2016/07/19 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
vue刷新和tab切换实例
2018/02/11 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
python中的对象拷贝示例 python引用传递
2014/01/23 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
python魔法方法-自定义序列详解
2016/07/21 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
Python基于滑动平均思想实现缺失数据填充的方法
2019/02/21 Python
python中必要的名词解释
2019/11/20 Python
python opencv 检测移动物体并截图保存实例
2020/03/10 Python
利用Vscode进行Python开发环境配置的步骤
2020/06/22 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
销售高级职员求职信
2013/10/29 职场文书
教师网络培训感言
2014/03/09 职场文书
工作收入住址证明
2014/10/28 职场文书
学校中秋节活动总结
2015/03/23 职场文书
教你使用vscode 搭建react-native开发环境
2021/07/07 Javascript
win11无法登录onedrive错误代码0x8004def7怎么办 ?
2022/04/05 数码科技