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中for循环语句的几种变型
Nov 26 PHP
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
PHP中改变图片的尺寸大小的代码
Jul 17 PHP
php class中public,private,protected的区别以及实例分析
Jun 18 PHP
CI框架支持$_GET的两种实现方法
May 18 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
Apr 18 PHP
详细解读php的命名空间(二)
Feb 21 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 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
Terran历史背景
2020/03/14 星际争霸
php使用sql server验证连接数据库的方法
2014/12/25 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
浅谈laravel框架sql中groupBy之后排序的问题
2019/10/17 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
jquery实现带缩略图的全屏图片画廊效果实例
2015/06/25 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
js下将金额数字每三位一逗号分隔
2016/02/19 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
纯JS实现只能输入数字的简单代码
2017/06/21 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
解决vue自定义指令导致的内存泄漏问题
2020/08/04 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
Python实现读取txt文件中的数据并绘制出图形操作示例
2019/02/26 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
Python日志syslog使用原理详解
2020/02/18 Python
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
世界上第一个水枕头:Mediflow
2018/12/06 全球购物
销售人员个人求职信
2013/09/26 职场文书
幼儿园庆六一活动方案
2014/03/06 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
激情洋溢的毕业生就业求职信
2014/03/15 职场文书
施工现场安全管理制度
2015/08/05 职场文书
廉政党课工作报告案例
2019/06/21 职场文书
MySQL数据库必备之条件查询语句
2021/10/15 MySQL
win10如何快速切换窗口 win10切换窗口快捷键分享
2022/07/23 数码科技