自从大约 7 年前开发我的第一个 MySQL 项目以来,我一直在使用相同的一组简单函数来访问数据库(尽管最近将它们放入了数据库类中)。
随着我开发的项目变得越来越复杂,数据库中的记录越来越多,因此出现内存问题的可能性越来越大。
我在遍历 MySQL 结果集时遇到 PHP 错误 Allowed memory size of 67108864 bytes exhausted
并且想知道是否有更好的方法来实现我在没有高内存的情况下的灵 active 用法。
我的函数如下所示:
function get_resultset($query) {
$resultset = array();
if (!($result = mysql_unbuffered_query($query))) {
$men = mysql_errno();
$mem = mysql_error();
echo ('<h4>' . $query . ' ' . $men . ' ' . $mem . '</h4>');
exit;
} else {
$xx = 0 ;
while ( $row = mysql_fetch_array ($result) ) {
$resultset[$xx] = $row;
$xx++ ;
}
mysql_free_result($result);
return $resultset;
}
}
然后我可以编写查询并使用该函数获取所有结果,例如
$query = 'SELECT * FROM `members`';
$resultset = get_resultset($query);
然后我可以遍历 $resultset
并显示结果,例如
$total_results = count($resultset);
for($i=0;$i<$total_results;$i++) {
$record = $resultset[$i];
$firstname = $record['firstname'];
$lastname = $record['lastname'];
// etc, etc display in a table, or whatever
}
有没有更好的方法来循环结果,同时仍然可以访问每条记录的属性来显示结果列表?
我一直在四处寻找有类似问题的人,但给出的答案似乎不适合我的情况或有些含糊。
最佳答案
您的问题是您要创建一个数组并用所有 结果集中的结果填充它,然后从函数返回这个巨大的数组。我想这不受任何 mysql_*
函数支持的原因是它非常低效。
你不应该用你得到的所有东西填满数组。你应该逐步检查结果,就像你填充数组时所做的那样,但不是填充任何东西,你应该处理结果并到达下一个结果,以便有机会释放这个结果的内存。
如果您使用 mysql_*
或 mysqli_*
函数,您应该返回资源,然后在您使用它的地方单步执行它,方法相同你正在通过它来填充数组。如果你使用 PDO , 然后你可以返回 PDOStatement
并使用 PDOStatement::fetch()
逐步完成。
关于php - 循环遍历 MySQL 结果集时出现“Allowed memory size of 67108864 bytes exhausted”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11713733/