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获取网络上文件
Oct 09 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
Dec 29 PHP
PHP通用检测函数集合
Feb 08 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
PHP查询数据库中满足条件的记录条数(两种实现方法)
Jan 29 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
Aug 19 PHP
帝国CMS留言板回复后发送EMAIL通知客户
Jul 06 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
基于PHP-FPM进程池探秘
Oct 17 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
javaScript Array(数组)相关方法简述
2009/07/25 Javascript
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
JS采用绝对定位实现回到顶部效果完整实例
2016/06/20 Javascript
常用的javascript设计模式
2017/01/11 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
python复制文件代码实现
2013/12/23 Python
PySide和PyQt加载ui文件的两种方法
2019/02/27 Python
python读写csv文件实例代码
2019/07/05 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
2019/07/23 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
Python requests接口测试实现代码
2020/09/08 Python
柒牌官方商城:中国男装优秀品牌
2017/06/30 全球购物
e路東瀛(JAPANiCAN)香港:日本旅游、日本酒店和温泉旅馆预订
2018/11/21 全球购物
会计专业毕业生自荐信范文
2013/12/20 职场文书
给领导的致歉信范文
2014/01/13 职场文书
工程师岗位职责规定
2014/02/26 职场文书
实习护士自荐信
2015/03/25 职场文书
同意报考证明
2015/06/17 职场文书
单位车辆管理制度
2015/08/05 职场文书
交通安全教育心得体会
2016/01/15 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
使用javascript解析二维码的三种方式
2021/11/11 Javascript
tomcat正常启动但网页却无法访问的几种解决方法
2022/05/06 Servers