Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql_free_result()内存耗尽_Php_Out Of Memory - Fatal编程技术网

Php mysql_free_result()内存耗尽

Php mysql_free_result()内存耗尽,php,out-of-memory,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\u free\u resul

我在我的类上创建了一个方法,用于获取所需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\u free\u result()
,但是在注释这一行时,它仍然不起作用

以下是
\u 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;

    }
  • 该代码非常复杂,可以简化为:

    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;
    }
    
    在没有双循环的情况下也能做到这一点

  • 问题是您正在从数据库获取所有数据,并将其存储在
    $result
    中,这意味着需要将其存储在内存中。默认情况下,PHP限制了脚本可用的内存量,因此您只是超出了该限制
    mysql\u free\u result
    与此无关。首先尝试获取较少的数据,或者在循环过程中处理
    中的数据,而不需要将所有数据存储在数组中

    如果没有帮助,请使用
    ini\u set('memory\u limit',$limit)
    小心地调高内存限制


  • 如果数据集太多,无法处理内存,可以考虑使用分页。太“脏”?1)过早失败,不要在末尾使用长嵌套的
    if..else
    return false
    。2) 如果没有结果行,
    $result
    从未定义,并且
    返回$result
    会触发错误。在您的例子中,您的
    返回false
    ,但是不初始化数组是一个典型的错误。3) 循环将数组的每个键和值分配给另一个数组是毫无意义的,只需按原样分配数组即可。4) 用
    $a
    手动跟踪数字索引是多余的,这就是
    $result[]=
    的作用。你的答案有帮助,但我不认为是这样,因为在这个特殊情况下,它处理了450行,然后耗尽了,但我已经处理了同一个表中的2000多行,没有任何问题或警告,您的脚本消耗64MB的内存,对于一个小PHP脚本来说,这是相当多的数据。我不知道你们在处理多少数据,显然,你们需要弄清楚。这似乎是我所看到的最有可能的解释。到时候我会努力弄清楚的!再次感谢你