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 を使用する必要があります。重いクエリを実行していないことを確認するため (一見、そうではないように見えます)。

2 番目の方法では、重すぎる BLOB または TEXT フィールドを取得している可能性があります。ローカルではありません。ローカル環境でこれを取得できないのはそのためです。

無限ループになっていないことを確認してください。になり得る?

trace php errors を使用し、このブロックを try/catch して、エラーに関するより良い情報を取得します。

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 に答える