PHP程序如何解决大量数据循环时的内存不足问题
在做PHP的开发的之前,一斜些较大的的数组做循环法不会习惯性报点4g内存缺乏的问题,假如那么的每条:
PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted
严重脚本错误信心显视同意的最多內存就已耗掉。出现这的严重脚本错误当时要我很惊讶,写PHP编译环节这几年,总体其实无为何要考虑过內存不到的话题,但一眨眼一想,同时了解的几乎是数剧表格显示报告信息量相当小,我呢?已经联合开发的此编译环节是需要一家foreach巡环语句在一家有二10万条收录的表层全表网络搜索都具有特殊共同点的数剧表格显示报告信息,也都是说,一场要把二10万条数剧表格显示报告信息取下,后来逐一检查报告每周数剧表格显示报告信息。就显而易见了,二10万条数剧表格显示报告信息其他加载失败到內存中,內存不爆才怪。
总归编写程序没人余年,我朦胧别忘了PHP里作为有非多次另一个读取动态的数据的API,是像进行处理流网络新闻因为那样,随用随取随丢、动态的数据并不太会沉积在电脑内存的查询系统技术。经由十分简单的网络搜索,果真在正式小程序上找寻的合适的妙用。
这家情况在PHP的管方公众号上叫缓解查寻网网和非缓解查寻网网(Buffered and Unbuffered queries)。PHP的查寻网网缺省的方法是缓解的方法。也就说说,查寻网网大数据然而会一回基本抽取到內存条里供PHP环节解决。如此给了PHP环节其他的的职能,譬如说,确定行数,将指示针指在某段行等。更根本的是环节可对大数据集反复性实现2次查寻网网和滤水等操作步骤。但那样缓解查寻网网的方法的问题就说需求內存条,也就说用空間换速度快。
相应的,额外另外一种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;
}
}
?>
- 前一个条: 乐博体育:身为PHP程序员一定要知道的8个库
- 下一只: 乐博体育:推荐一个PHP数组去除重复元素更快的方法