1

我一直看到内存耗尽错误

PHP 致命错误:允许的内存大小为 268 435 456 字节已用尽

在我的日志文件中。

即使服务器负载非常轻且无法在本地主机上重现,此错误也会随机出现。我有一个来自 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中的问题。请帮忙...

4

2 回答 2

1

内存耗尽可能很难调试,因为错误只告诉您内存最终用完的位置,而不是大部分内存的使用位置。

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

于 2012-04-24T20:54:21.323 回答
0

您应该对您的查询使用 EXPLAIN。确保您没有做一些繁重的查询(乍一看似乎没有)。

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

确保你没有得到一个无限循环。可能?

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

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

} catch (Exception $e) {
   debug_print_backtrace(); 
   var_dump($e->getMessage());
}
于 2012-04-24T20:52:28.590 回答