mysql_free_result()中的内存耗尽

时间:2014-03-18 20:11:28

标签: php out-of-memory

我在我的类上创建了一个方法来获取并在数组中存储所需的SQL语句所包含的所有结果,并且它的工作正常。现在,经过几个月的制作,我遇到了这个错误:

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 3503272 bytes) in C:\xxpathxx\class.DGC_Gerais.php on line 0

当我开始检查时,我将错误追踪到mysql_free_result(),但在评论该行时,它仍然可以正常工作。

以下是_fetch方法:

PUBLIC static function _fetch($sql){
        $q = mysql_query($sql);

        if(mysql_num_rows($q) > 0):

            for($a=0 ; $linha = mysql_fetch_row($q) ; $a++){ // forEach row.
                foreach($linha as $chave => $valor): // forEach field.
                    $result[$a][$chave] = $valor;
                endforeach;

            }

//          mysql_free_result($q);

            return $result;

        else:
            return false;
        endif;

    }

1 个答案:

答案 0 :(得分:1)

  1. 该代码非常错综复杂,可以简化为:

    public static function _fetch($sql) {
        $q = mysql_query($sql);
    
        if (mysql_num_rows($q) == 0) {
            return false;
        }
    
        $result = array();
        while ($linha = mysql_fetch_row($q)) {
            $result[] = $linha;
        }
        return $result;
    }
    

    如果没有双循环则完全相同。

  2. 问题是您从数据库中获取所有数据并将其存储在$result中,这意味着它需要存储在内存中。并且PHP默认限制脚本可用的内存量,因此您只是超出了该限制。 mysql_free_result没有任何与此有关的东西。首先尝试获取更少的数据,或者处理while循环内的数据,而无需将所有内容存储在数组中。

    如果这没有帮助,请使用ini_set('memory_limit', $limit)小心调低内存限制。