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 COOKIE设置为浏览器进程
Jun 21 PHP
php 调用远程url的六种方法小结
Nov 02 PHP
PHP 创建标签云函数代码
May 26 PHP
用PHP将数据导入到Foxmail的实现代码
Sep 05 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
Jun 07 PHP
PHP 异步执行方法,模拟多线程的应用分析
Jun 03 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
PHP编程之设置apache虚拟目录
Jul 08 PHP
phpMyAdmin通过密码漏洞留后门文件
Nov 20 PHP
PHP开发实现快递查询功能详解
Apr 08 PHP
PHP 计算两个时间段之间交集的天数示例
Oct 24 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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简单实现MVC
2015/02/05 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
php判断访问IP的方法
2015/06/19 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
JS类中定义原型方法的两种实现的区别
2007/03/08 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
Angularjs 动态添加指令并绑定事件的方法
2017/04/13 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
React组件生命周期详解
2017/07/03 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
使用Python绘制图表大全总结
2017/02/11 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
Python csv模块使用方法代码实例
2019/08/29 Python
Python sys模块常用方法解析
2020/02/20 Python
python 日志 logging模块详细解析
2020/03/31 Python
python和go语言的区别是什么
2020/07/20 Python
python matplotlib绘制三维图的示例
2020/09/24 Python
python 实现的IP 存活扫描脚本
2020/12/10 Python
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
医学生自荐信范文
2013/12/03 职场文书
大学生个人求职口试自我评价
2014/02/16 职场文书
营销学习心得体会
2014/09/12 职场文书
研究生个人学年总结
2015/02/14 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
python requests模块的使用示例
2021/04/07 Python
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA