如何解决PHP查询大量数据内存耗尽的问题

数据库查询大量数据时会出现内容不够的提示
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted


这个问题在PHP的官方网站上叫缓冲查询和非缓冲查询(Buffered and Unbuffered queries)。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存,也就是用空间换速度。


相对的,另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。


很显然,缓冲查询模式适用于小数据量查询,而非缓冲查询适应于大数据量查询。


对于PHP的缓冲模式查询大家都知道,下面列举的例子是如何执行非缓冲查询API。


 非缓冲查询方法一: mysqli

[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. $mysqli  = new mysqli("localhost""my_user""my_password""world");  
  3. $uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);  
  4. if ($uresult) {  
  5.    while ($row = $uresult->fetch_assoc()) {  
  6.        echo $row['Name'] . PHP_EOL;  
  7.    }  
  8. }  
  9. $uresult->close();  
  10. ?>  


非缓冲查询方法二: pdo_mysql
[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. $pdo = new PDO("mysql:host=localhost;dbname=world"'my_user''my_pass');  
  3. $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);  
  4. $uresult = $pdo->query("SELECT Name FROM City");  
  5. if ($uresult) {  
  6.    while ($row = $uresult->fetch(PDO::FETCH_ASSOC)) {  
  7.        echo $row['Name'] . PHP_EOL;  
  8.    }  
  9. }  
  10. ?>  


//非缓冲查询方法三: mysql
[php]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. $conn = mysql_connect("localhost""my_user""my_pass");  
  3. $db   = mysql_select_db("world");  
  4. $uresult = mysql_unbuffered_query("SELECT Name FROM City");  
  5. if ($uresult) {  
  6.    while ($row = mysql_fetch_assoc($uresult)) {  
  7.        echo $row['Name'] . PHP_EOL;  
  8.    }  
  9. }  
  10. ?>  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值