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 相关文章推荐
用Socket发送电子邮件
Oct 09 PHP
用PHP读取RSS feed的代码
Aug 01 PHP
腾讯QQ微博API接口获取微博内容
Oct 30 PHP
php define的第二个参数使用方法
Nov 04 PHP
php生成gif动画的方法
Nov 05 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
Dec 14 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP依赖注入原理与用法分析
Aug 21 PHP
PHP实现PDO操作mysql存储过程示例
Feb 13 PHP
php适配器模式简单应用示例
Oct 23 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 PHP
PHP获取学生成绩的方法
Nov 17 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变量作用域以及地址引用问题
2013/12/27 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
JavaScript 事件冒泡简介及应用
2010/01/11 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
基于jQuery实现自动轮播旋转木马特效
2015/11/02 Javascript
详解javascript遍历方式
2015/11/11 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
vue动态渲染svg、添加点击事件的实现
2020/03/13 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[01:23]2019完美世界全国高校联赛(春季赛)合肥全国总决赛
2019/06/10 DOTA
python多重继承实例
2014/10/11 Python
利用python循环创建多个文件的方法
2018/10/25 Python
分析经典Python开发工程师面试题
2019/04/08 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
使用python切片实现二维数组复制示例
2019/11/26 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
Pandas的数据过滤实现
2021/01/15 Python
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
2015年仓库工作总结
2015/04/09 职场文书
警告通知
2015/04/25 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
婚礼领导致辞大全
2015/07/28 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
Python上下文管理器Content Manager
2021/06/26 Python