Php mysql_free_result()内存耗尽
我在我的类上创建了一个方法,用于获取所需SQL语句中包含的所有结果并将其存储在数组中,并且效果很好。现在,经过几个月的生产,我遇到了这个错误: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
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脚本来说,这是相当多的数据。我不知道你们在处理多少数据,显然,你们需要弄清楚。这似乎是我所看到的最有可能的解释。到时候我会努力弄清楚的!再次感谢你