PHP程序如何解决大量数据循环时的内存不足问题
在做PHP设计的阶段,有条些极大的数组做无限循环时候习惯性报点存储空间不足之处的毛病,这类上面的一条什么:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
不正确的代码信息查询凸显限制的更大运存早就失去。发现这种的不正确的代码刚开始令我很惊讶,写PHP执行程度越来越许多年,关键也许不如何了解过运存不足之处的的问题,但时光飞逝一想,真接沾染的很多是大信息资料文件量是比较小,而自己已经在发展的这样的执行程度是要使用某个foreach反复语句在某个有十五万三条统计的表上全表网络搜索体现了指定特征描述的大信息资料文件,也那其实,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;
}
}
?>