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 相关文章推荐
Ajax PHP分页演示
Jan 02 PHP
PHP学习 运算符与运算符优先级
Jun 15 PHP
CI(CodeIgniter)框架配置
Jun 10 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
PHP基于imap获取邮件实例
Nov 11 PHP
PHP获取一段文本显示点阵宽度和高度的方法
Mar 12 PHP
PHP也能干大事 随机函数
Apr 14 PHP
PHP自定义错误用法示例
Sep 28 PHP
PHP实现的自定义数组排序函数与排序类示例
Nov 18 PHP
php异步:在php中使用fsockopen curl实现类似异步处理的功能方法
Dec 10 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
php和html的区别点详细总结
Sep 24 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
怎么使 Mysql 数据同步
2006/10/09 PHP
php 删除数组元素
2009/01/16 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
PHP重载基础知识回顾
2020/09/10 PHP
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
JavaScript利用HTML DOM进行文档操作的方法
2016/03/28 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
BootStrap点击保存后实现模态框自动关闭的思路(模态框)
2017/09/26 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
开发用到的js封装方法(20种)
2018/10/12 Javascript
微信小程序云开发之云函数详解
2019/05/16 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
2019/06/11 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python读写文件操作示例程序
2013/12/02 Python
Python学习笔记之常用函数及说明
2014/05/23 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Django权限机制实现代码详解
2018/02/05 Python
Python贪心算法实例小结
2018/04/22 Python
python实现Windows电脑定时关机
2018/06/20 Python
使用Django简单编写一个XSS平台的方法步骤
2019/03/25 Python
python使用 zip 同时迭代多个序列示例
2019/07/06 Python
python的链表基础知识点
2020/09/13 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
Css3新特性应用之视觉效果实例
2016/12/12 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
员工廉洁自律承诺书
2014/05/26 职场文书
小学优秀教师材料
2014/12/15 职场文书