php - 循环遍历 MySQL 结果集时出现“Allowed memory size of 67108864 bytes exhausted”错误

标签 php mysql memory resultset

自从大约 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/

相关文章:

内存块分析 - 3d 程序意外终止

php - 在 Laravel 中应用 Bootstrap 后页面出现盒装外观

Java:如何插入N:M关联表

php - 检查唯一 session 的 MySQL 和 PHP 方法

c - 在 C 中使用 !(x-a) 而不是 x==a

c - printf C程序中的当前地址

php - 获取最后插入的id

php - 如何删除SQL注入(inject)中手动添加的反斜杠?

javascript - 根据日期重定向到不同的网页

MySQL COUNT() 和重复项