PHP 致命错误:允许的内存大小 268435456 字节已耗尽


PHP Fatal error: Allowed memory size of 268435456 bytes exhausted

我一直看到内存耗尽错误

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

在我的日志文件中。

即使服务器负载非常轻且在本地主机上不可重现,此错误也会随机出现。我有一个来自主机的 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 条记录。我在函数内部的 while 循环中得到内存耗尽错误func_select_array。我无法想象这个查询需要 256M+。这似乎不是 php 问题,而是 mysql 中的某些问题。请帮忙...

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

您可以使用内存分析器

(例如 Xdebug 中的性能分析器)来查找所有内存的去向。

你应该使用 EXPLAIN 来查询。为了确保您不会进行一些繁重的查询(乍一看似乎没有)。

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

确保您不会得到无限循环。可能是?

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

try {
        while ($row=mysql_fetch_assoc($qry_result))
        {
            $data[$i] = $row;
            $i++;
        }
} catch (Exception $e) {
   debug_print_backtrace(); 
   var_dump($e->getMessage());
}