PHP大量数据循环时内存耗尽问题的解决方案

方今在付出一个PHP程序时相遇了下边包车型地铁大错特错:

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

错误新闻展现允许的最大内部存款和储蓄器已经耗尽。遭逢那样的谬误初阶让小编很好奇,但转眼一想,也不意外,因为自身正在开采的那么些顺序是要用三个foreach循环语句在一个有4万条记下的表里全表寻觅具有一定特征的数据,也正是说,二遍要把4万条数据收取,然后依次检查每一天数据。总之,4万条数据总体加载到内部存款和储蓄器中,内部存款和储蓄器不爆才怪。

图片 1

归根结蒂编制程序这么经过了相当长的时间,作者隐隐记得PHP里提供有非一次全体加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会堆放在内部存储器的查询格局。经过简短的寻觅,果然在官方网站上找到的正确的用法。

其大器晚成标题在PHP的官网上叫缓冲查询和非缓冲查询(Buffered and Unbuffered
queries卡塔尔。
PHP的查询缺省方式是缓冲情势。也正是说,查询数据结果会三遍全部领取到内存里供PHP程序管理。那样给了PHP程序额外的效用,比方说,总括行数,将
指针指向某生机勃勃行等。更重要的是前后相继能够对数据集一再实行二回查询和过滤等操作。但这种缓冲查询方式的毛病正是消耗内部存款和储蓄器,也等于用空间换速度。

绝对的,此外意气风发种PHP查询形式是非缓冲查询,数据库服务器会一条一条的回到数据,并不是三回全部赶回,这样的结果正是PHP程序消耗少之又少的内部存储器,但却充实了数据库服务器的压力,因为数据库会一向守候PHP来取多少,一直到数量总体取完。

很鲜明,缓冲查询情势适用于小数据量查询,而非缓冲查询适应于大数据量查询。

对此PHP的缓冲情势查询咱们都清楚,下边列举的例证是什么样试行非缓冲查询API。

非缓冲查询格局风度翩翩: mysqli

<?php 
$mysqli  = new mysqli("localhost", "my_user", "my_password", "world"); 
$uresult = $mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT); 

if ($uresult) { 
   while ($row = $uresult->fetch_assoc()) { 
       echo $row['Name'] . PHP_EOL; 
   } 
} 
$uresult->close(); 
?>

非缓冲查询艺术二: pdo_mysql

<?php 
$pdo = new PDO("mysql:host=localhost;dbname=world", 'my_user', 'my_pass'); 
$pdo->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; 
   } 
} 
?>

非缓冲查询办法三: mysql

<?php 
$conn = mysql_connect("localhost", "my_user", "my_pass"); 
$db   = mysql_select_db("world"); 

$uresult = mysql_unbuffered_query("SELECT Name FROM City"); 
if ($uresult) { 
   while ($row = mysql_fetch_assoc($uresult)) { 
       echo $row['Name'] . PHP_EOL; 
   } 
} 
?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注