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+ajax做仿百度搜索下拉自动提示框(有实例)
Aug 21 PHP
PHP链接MySQL的常用扩展函数
Oct 23 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
PHP设计模式之适配器模式代码实例
May 11 PHP
使用PHPCMS搭建wap手机网站
Sep 20 PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 PHP
PHP中Array相关函数简介
Jul 03 PHP
PHP构造函数与析构函数用法示例
Sep 28 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
Feb 03 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
详解如何在云服务器上部署Laravel
Jun 30 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
关于zend studio 出现乱码问题的总结
2013/06/23 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
javascript xml为数据源的下拉框控件
2009/07/07 Javascript
jquery多浏览器捕捉回车事件代码
2010/06/22 Javascript
jquery学习总结(超级详细)
2014/09/04 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
vuejs如何配置less
2017/04/25 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
微信小程序如何自定义table组件
2019/06/29 Javascript
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
如何利用python检测图片是否包含二维码
2020/10/15 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
css3实例教程 一款纯css3实现的环形导航菜单
2014/10/20 HTML / CSS
HTML5利用约束验证API来检查表单的输入数据的代码实例
2016/12/20 HTML / CSS
英国花园、DIY、电器和家居用品商店:Robert Dyas
2019/03/18 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
临床医学专业毕业生的自我评价
2013/10/17 职场文书
新闻编辑自荐信
2013/11/03 职场文书
高二历史教学反思
2014/01/25 职场文书
生态养殖创业计划书
2014/05/06 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
公司授权委托书
2014/10/17 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
2019年行政人事个人工作总结范本!
2019/07/19 职场文书
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android