微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php查询mysql大量数据造成内存不足的解决方法

本文实例分析了PHP查询MysqL大量数据造成内存不足的解决方法分享给大家供大家参考。具体分析如下:

一、问题

使用PHP查询MysqL大数据量的时候,程序尚未执行完毕,跳出警告: Fatal error: Allowed memory size of 100663296 bytes exhausted (tried to allocate 103 bytes) 错误提示PHP所分配到的100M内存被占用完毕。

二、解决方法

最简单的解决办法是:在执行文件的头部增加

rush:PHP;"> 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、PHPMysqL_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程序设计有所帮助。

原文地址:https://www.jb51.cc/php/22546.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐