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
解析dedecms空间迁移步骤详解
May 15 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
将php数组输出html表格的方法
Feb 24 PHP
php $_SESSION会员登录实例分享
Jan 19 PHP
round robin权重轮循算法php实现代码
May 28 PHP
浅析php中array_map和array_walk的使用对比
Nov 20 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
Nov 30 PHP
PHP mysqli事务操作常用方法分析
Jul 22 PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 PHP
phpstudy后门rce批量利用脚本的实现
Dec 12 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
jQuery使用height()获取高度需要注意的地方
2014/12/13 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
vue+vue-validator 表单验证功能的实现代码
2017/11/13 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
微信小程序自定义扫码功能界面的实现代码
2020/07/02 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
jQuery实现简单全选框
2020/09/13 jQuery
详解基于element的区间选择组件校验(交易金额)
2021/01/07 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
2018/12/19 Python
Python OpenCV实现视频分帧
2019/06/01 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
专营店会计助理岗位职责
2013/11/29 职场文书
酒店门卫岗位职责
2013/12/29 职场文书
奶茶专卖店创业计划书
2014/01/18 职场文书
闭幕式主持词
2014/04/02 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
个人租房协议书样本
2014/10/01 职场文书
延安红色之旅心得体会
2014/10/07 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
个人优缺点总结
2015/02/28 职场文书
投资合作意向书范本
2015/05/08 职场文书
python实现三次密码验证的示例
2021/04/29 Python
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS