循环遍历MySQL结果集时,PHP'允许的内存大小为67108864字节已用尽'

OnT*_*Fly 1 php mysql memory resultset

自从大约7年前开发我的第一个mySQL项目以来,我一直在使用相同的一组简单函数来访问数据库(尽管最近将这些函数放入了数据库类).随着我开发的项目变得越来越复杂,数据库中有更多的记录,因此更有可能出现内存问题.

Allowed memory size of 67108864 bytes exhausted在循环访问mySQL结果集时遇到PHP错误,并且想知道是否有更好的方法来实现我没有高内存使用的灵活性.

我的功能看起来像这样:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以编写一个查询并使用该函数来获取所有结果,例如:

$query = 'SELECT * FROM `members`';
$resultset = get_resultset($query);
Run Code Online (Sandbox Code Playgroud)

然后我可以遍历$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
}
Run Code Online (Sandbox Code Playgroud)

是否有更好的循环结果,同时仍然可以访问每个记录的属性以显示结果列表?我一直在寻找有类似问题的人,所给出的答案似乎不适合我的情况或有点模糊.任何帮助将不胜感激.

rid*_*rid 5

你的问题是你正在创建一个数组并用结果集中的所有结果填充它,然后从函数中返回这个巨大的数组.我认为任何mysql_*函数都不支持这个原因的原因是效率非常低.

你不应该用你得到的一切填满数组.您应该逐步完成结果,就像填充数组时一样,但是不应该填充任何内容,而是应该处理结果并转到下一个结果,这样就可以释放这个结果的内存.

如果你使用mysql_*mysqli_*函数,你应该返回资源,然后在你使用它的地方逐步执行它,就像你踩过它来填充数组一样.如果您使用PDO,那么您可以返回PDOStatement并使用PDOStatement::fetch()它来逐步执行它.