PHP程序如何解决大量数据循环时的内存不足问题
在做PHP开发技术的之时,还有一个些比较大的数组做再循环时有三天两头报那些运存过低的方面,这类接着的如下:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
情况新信息彰显可以的最高硬盘已然用尽。面临是这样的情况原本叫我很咋舌,写PHP编译系统软件如此年,基本的也许没能怎末要考虑过硬盘不到位的情况,但时光飞逝一想,同时接触到的绝大多数是动态文件大小较小,我也正设计规划的某个编译系统软件是要使用某个foreach循环往复语句在某个有十五万多个记下的表内全表百度搜索都具有指定区域显著特点的动态统计统计数据资料表格,也即使说,第一次要把十五万多个动态统计统计数据资料表格卸下来,第二逐项检测每日动态统计统计数据资料表格。由此可见,十五万多个动态统计统计数据资料表格所有的添加到硬盘中,硬盘不爆才怪。
即便源程序没法常年,我若隐若现想起PHP里保证有非一天全初始化参数文件的API,是像精准处理流互联网媒体那么,随用随取随丢、参数文件并不用积淀在运行内存的验证具体方法。过非常简单的搜,果不其然在官方版公众号上选择的精准的使用说明。
这里疑问在PHP的管方网 上叫降低查到和非降低查到(Buffered and Unbuffered queries)。PHP的查到缺省模型是降低模型。也便是说,查到数据信息的结果会一回大部分分离出来到4g手机内存里供PHP环节基本操作。怎样给了PHP环节增加的系统,打个比方说,计算行数,将指南面向某个行等。更比较重要的是环节还可以对数计算据信息集对此开展三次查到和滤水等基本操作。但一些降低查到模型的问题便是消费4g手机内存,也便是用室内空间换网络速度。
对的,额外的PHP查询系统系统策略是否储存查询系统系统,大大大数值源安全服务质量器会1条1条的加载大大大数值,而并非是一个所有加载,这类的最终也是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;
}
}
?>