PHP一大波数量循环时内存耗尽难题的消除方案

PHP一大波数量循环时内存耗尽难题的消除方案

<?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

图片 1

错误新闻彰显允许的最大内部存款和储蓄器已经耗尽。境遇那样的谬误起首让自个儿很离奇,但转手一想,也不奇异,因为自身正在开荒的那么些程序是要用二个foreach循环语句在叁个有4万条记下的表里全表找寻具备特定特征的多寡,也正是说,贰回要把4万条数据抽出,然后依次检查每一天数据。总体上看,4万条数据总体加载到内部存款和储蓄器中,内部存款和储蓄器不爆才怪。

究竟编程这么日久天长,作者隐隐记得PHP里提供有非二次全部加载数据的API,是像管理流媒体那样,随用随取随丢、数据并不会积攒在内部存款和储蓄器的询问方式。经过简短的搜索,果然在官方网站上找到的正确性的用法。

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

绝对的,别的一种PHP查询情势是非缓冲查询,数据库服务器会一条一条的回到数据,并非贰遍全体回到,那样的结果正是PHP程序消耗非常少的内部存款和储蓄器,但却充实了数据库服务器的压力,因为数据库会一向守候PHP来取多少,一向到数量总体取完。

对于PHP的缓冲方式查询大家都知情,下边罗列的事例是何等实行非缓冲查询API。

<?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

非缓冲查询情势一: mysqli

很醒目,缓冲查询格局适用于小数据量查询,而非缓冲查询适应于大数据量查询。

目前在支付叁个PHP程序时相遇了上面包车型大巴失实:

本条题材在PHP的官网上叫缓冲查询和非缓冲查询(Buffered and Unbuffered
queries卡塔尔国。
PHP的询问缺省情势是缓冲形式。也正是说,查询数据结果会贰回全体提取到内部存储器里供PHP程序管理。那样给了PHP程序额外的法力,举例说,计算行数,将
指针指向某一行等。更主要的是程序能够对数码集一再进行三回询问和过滤等操作。但这种缓冲查询格局的劣点正是消耗内部存款和储蓄器,也正是用空间换速度。

<?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; 
   } 
} 
?>

发表评论

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

网站地图xml地图