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 相关文章推荐
使用sockets:从新闻组中获取文章(三)
Oct 09 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
Aug 17 PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
php 保留小数点
Apr 21 PHP
mac环境中使用brew安装php5.5.15
Aug 18 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
CI框架入门之MVC简单示例
Nov 21 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
Aug 31 PHP
laravel-admin的多级联动方法
Sep 30 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 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
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
jquery中each遍历对象和数组示例
2014/08/05 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
12行javascript代码绘制一个八卦图
2015/04/02 Javascript
详解JavaScript中jQuery和Ajax以及JSONP的联合使用
2015/08/13 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
js Canvas实现的日历时钟案例分享
2016/12/25 Javascript
解决vue-cli webpack打包后加载资源的路径问题
2018/09/25 Javascript
nuxt中使用路由守卫的方法步骤
2019/01/27 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
Python脚本获取操作系统版本信息
2016/12/17 Python
解决python 输出是省略号的问题
2018/04/19 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Pyqt5 实现跳转界面并关闭当前界面的方法
2019/06/19 Python
Python登录系统界面实现详解
2019/06/25 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
python 6行代码制作月历生成器
2020/09/18 Python
python3爬虫GIL修改多线程实例讲解
2020/11/24 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
故宫导游词
2015/01/31 职场文书
伏羲庙导游词
2015/02/09 职场文书
最美乡村教师观后感
2015/06/11 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书
MySQL慢查询的坑
2021/04/28 MySQL
CSS实现九宫格布局(自适应)的示例代码
2022/02/12 HTML / CSS