2012-04-24 123 views
1

我总是看到一个内存耗尽错误PHP致命错误:268435456个字节允许内存大小耗尽

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

在我的日志文件。

即使当服务器非常轻载&在本地主机上不可重现时,此错误也会随机出现。我有一个来自hostgator的VPS 4服务器,负载为MB。 PHP配置允许高达256 Mb。

的代码如下

function func_select_array($qry) 
{ 
    $i=0; 
    $data=array(); 
    $qry_result=mysql_query($qry); 

    if($qry_result) 
    { 
     while ($row=mysql_fetch_assoc($qry_result)) 
     { 
      $data[$i] = $row; 
      $i++; 
     } 
     return $data; 
    } 
    else 
    { 
     return 2; 
    } 
} 


    function func_check_rule_out_bid($auc_id,$bid_amount,$return_freq,$recheck) 
    { 
     $bid_qry="select * from tbl_bid where ubaid='".$auc_id."' and ubf='1' order by uba desc limit 0,10"; 
     $bid_array=func_select_array($bid_qry); 
    } 

表tbl_bid有2800条记录。 我在func_select_array函数内的while循环中得到内存耗尽错误。 我无法想象这个查询需要256M +。它似乎不是一个PHP的问题,但在MySQL中的东西。请帮助...

+0

你到底在哪一行发生错误。并放心,是有关PHP,而不是MySQL。如果它是mysql,那么服务器不会返回结果。但是你应该验证你是否发送了正确的查询。 – hakre 2012-04-24 19:48:57

+0

2800记录可能是确定的。每个记录的大小是多少?他们是否包含“BLOB”? – 2012-04-24 19:51:20

+0

业务的第一顺序是重新创建错误。如果没有,记录一切。如果可能的话,在内存用完之前记录查询,'mysql_num_rows()','memory_get_peak_usage()'的结果和其他任何内容。然后,下次发生这种情况时,您可以查看它试图迭代的查询和记录数量。你可能会发现一些你通常不会期望的东西。 – 2012-04-24 20:22:47

回答

0

您应该使用EXPLAIN来查询。为了确保你不会做一些沉重的查询(起初看起来似乎没有)。

第二种方式,可能是你得到一些太重的BLOB或TEXT字段。不在你的地方,这就是为什么你无法在当地环境得到这个。

确保您没有收到无限循环。可能?

使用trace php错误并尝试/​​捕获此块以获取有关错误的更好信息。

try { 
     while ($row=mysql_fetch_assoc($qry_result)) 
     { 
      $data[$i] = $row; 
      $i++; 
     } 

} catch (Exception $e) { 
    debug_print_backtrace(); 
    var_dump($e->getMessage()); 
} 
+0

你好。查询并不大。该表有11列(5个整数,4个varchar(255),1个datetime和1个double)。我不认为我进入了无限循环,因为这是查询大部分时间都很好。内存错误随机出现。同样在调用函数中,我将行数限制为10.因此,无论表中的记录数是多少,如果只有10行被迭代,那么如何解决问题呢?你能告诉我我怎么能试着抓住并记录哪个查询导致内存错误? – Anita 2012-04-25 18:46:57

+0

除了你可以打印你的查询,看看是否没有什么奇怪的东西在某个地方。 – ontananza 2012-04-25 21:27:41

1

内存耗尽是非常困难的调试,因为错误只告诉你哪里的记忆终于耗尽了,不要在那里用它的大部分。

您可以使用内存分析器(例如Xdebug中的内存分析器)来查找所有内存的位置。

相关问题