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 相关文章推荐
真正面向对象编程:PHP5.01发布
Oct 09 PHP
深入理解PHP之require/include顺序 推荐
Jan 02 PHP
使用php shell命令合并图片的代码
Jun 23 PHP
php中判断文件空目录是否有读写权限的函数代码
Aug 07 PHP
解析:使用php mongodb扩展时 需要注意的事项
Jun 18 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
简单概括PHP的字符串中单引号与双引号的区别
May 07 PHP
php输出含有“#”字符串的方法
Jan 18 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
提高Laravel应用性能方法详解
Jun 24 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
Sep 17 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处理换行符的问题 \r\n
2013/06/13 PHP
解析link_mysql的php版
2013/06/30 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
php使用百度ping服务代码实例
2014/06/19 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
javascript 一些用法小结
2009/09/11 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
JavaScript实现自己的DOM选择器原理及代码
2013/03/04 Javascript
初识Javascript小结
2015/07/16 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
老司机带你解读jQuery插件开发流程
2016/05/16 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
详解python时间模块中的datetime模块
2016/01/13 Python
Tornado 多进程实现分析详解
2018/01/12 Python
Python根据服务获取端口号的方法
2019/09/25 Python
python super的使用方法及实例详解
2019/09/25 Python
如何实现更换Jupyter Notebook内核Python版本
2020/05/18 Python
Python轻量级web框架bottle使用方法解析
2020/06/13 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
作文评语怎么写
2014/12/25 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL
vue中使用mockjs配置和使用方式
2022/04/06 Vue.js
4种方法python批量修改替换列表中元素
2022/04/07 Python