最近在开发PHP程序时遇到如下错误:PHPFatalerror:Allowedmemorysizeof268435456bytesexhausted错误信息显示最大允许的内存已用完。遇到这样的错误,一开始我很惊讶,但后来想了想,也不奇怪了,因为我开发的程序是用foreach循环语句在一个有40000条记录的表中搜索全表,具有特定的特征那也就是说,一次取出4万条数据,然后每天的数据逐条检查。可想而知,四万条数据全部加载到内存中,内存不炸裂也就不足为奇了。毕竟自己编程这么多年了。依稀记得PHP提供了一个API,不会一次性加载所有数据。是一种随用随取随丢的查询方式,数据不会像流媒体一样堆积在内存中。经过简单的搜索,在官网找到了正确的用法。这个问题在PHP官网上叫做BufferedandUnbufferedqueries。PHP的查询默认模式是缓冲模式。也就是说,查询数据的结果会一次性全部提取到内存中,供PHP程序处理。这为PHP程序提供了额外的功能,例如,计算行数、将指针指向特定行等。更重要的是,程序可以对数据集重复进行二次查询、过滤等操作。但是这种缓存查询方式的缺陷是很耗内存,即以空间换取速度。相比之下,另一种PHP查询模式是非缓冲查询。数据库服务器会一个接一个地返回数据,而不是一次全部返回。结果是PHP程序消耗的内存少了,但是增加了数据库服务器的压力,因为数据库会等待PHP去取数据,直到取完所有数据。显然,缓冲查询模式适用于小数据量的查询,而非缓冲查询模式适用于大数据量的查询。PHP的缓冲查询模式大家都知道,下面的例子就是如何实现非缓冲查询API。非绑定查询方法一:mysqliquery("SELECTNameFROMCity",MYSQLI_USE_RESULT);if($uresult){while($row=$uresult->fetch_assoc()){echo$row['Name'].PHP_EOL;}}$uresult->close();?>非绑定查询方法二:pdo_mysqlsetAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,false);$result=$pdo->query("SELECTNameFROMCity");if($uresult){while($row=$uresult->fetch(PDO::FETCH_ASSOC)){echo$row['Name'].PHP_EOL;}}?>非绑定查询方法三:mysql
