新蒲京200.c软件下载-app官网网址 > 问答 >

4万条数据总体加载到内部存款和储蓄器中

新近在支付多少个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; 
   } 
} 
?>
下一篇:没有了