相信从事 php 开发的程序猿应该都有内存耗尽的经历,有经验的童鞋可能可以很快的解决,但是对于 php 入门级或还在学习 php 中的菜鸟,解决起来可能还是有点问题。小编整理了一个 php 中,大量数据循化时内存耗尽问题的解决办法,有需要的亲,赶紧学起来吧。
首先看一下,错误发生的时候,一般都会出现下面这段代码:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
错误信息显示允许的最大内存已经耗尽。怎么办呢?
在 PHP 里提供有非一次全部加载数据的 API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。
这个问题在 PHP 的官方网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。 PHP 的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供 PHP 程序处理。这样给了 PHP 程序额外的功能,比如说,计算行数,将 指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。
相对的,另外一种 PHP 查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是 PHP 程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待 PHP 来取数据,一直到数据全部取完。
从这两种数据查询方式我们可以看出,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。
对于 PHP 的缓冲模式查询,对 php 有一定了解的童鞋应该都清楚,下面我们就举例重点为大家展示非缓冲查询 API 是如何执行的。
1、mysqli 方法
query("SELECT Name FROM City", MYSQLI_USE_RESULT); if ($uresult) { while ($row = $uresult->fetch_assoc()) { echo $row['Name'] . PHP_EOL; } } $uresult->close(); ?>2、 pdo_mysql 方法
setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); $uresult = $pdo->query("SELECT Name FROM City"); if ($uresult) { while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) { echo $row['Name'] . PHP_EOL; } } ?>3、 mysql 方法
以上就是 php 中数据循化过大时,查询数据使用非缓冲查询的方法,以避免内存耗尽情况。如果你遇到了类似内存耗尽问题,不妨可以试一试上面的方法。
相关文章:《php 学习之 Session 详解》 http://www.maiziedu.com/group/article/5682/
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于