2012-04-24 2 views
1

を使い果たし、私は私のログファイルにメモリ疲れエラーPHPの致命的なエラー:268435456バイトの許可メモリサイズが

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

を見続けます。

このエラーは、サーバーが非常に軽くローカルホスト上で再現できない&ロードされた場合でも、ランダムに付属しています。私はMBの負荷とhostgatorからVPS 4サーバーを持っています。 PHPの設定は最大256 Mbを可能にします。表tbl_bid 2800件のレコードを有する

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); 
    } 

の下

コードです。 func_select_array関数のwhileループでメモリが使い果たされました。 このクエリに256M +が必要であるとは思いません。それはPHPの問題ではないようですが、mysqlの中にあるものです。

+0

どのラインで正確にエラーが表示されますか。そして、PHPに関連していることを確かめてください。mysqlではありません。 mysqlの場合、サーバは結果を返しません。しかし、適切なクエリを送信するかどうかを確認する必要があります。 – hakre

+0

2800レコードはおそらく問題ありません。各レコードのサイズは?彼らは 'BLOB'を含んでいますか? –

+0

ビジネスの最初の順序は、エラーを再作成することです。それに失敗すると、すべてを記録する。可能であれば、mysql_num_rows()、memory_get_peak_usage()などの結果をメモリに残す前にログに記録します。次に、それが次回発生したときに、繰り返し実行しようとしたクエリとレコードの数を確認できます。通常は期待しないことがあるかもしれません。 –

答えて

0

あなたはyoureのクエリにEXPLAIN使用する必要があります...助けてください。あなたが何か重い質問をしていないことを保証するために(最初の一見ではないようです)。

第二の方法であってもよいが、あなたはあまりにも重いですいくつかのBLOB OTテキストフィールドを取得しています。あなたの地元ではありません、あなたはなぜこれを地元の環境で得ることができないのですか。

は、youreのinfinteループを得ていないことを保証します。になり得る?

使用すると、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 int、4 varchars(255)、1 datetime&1 double)があります。私は無限ループに陥っているとは思わない。なぜなら、これはほとんどの場合、クエリがうまくやっているからだ。メモリエラーがランダムに発生しています。また、呼び出し関数では、私は行の数を10に制限しています。だから、テーブルのレコードの数に関係なく、たったの10行が常に反復されるならば、どのように問題が生じるでしょうか?私はどのようにメモリエラーを引き起こしたクエリをキャッチ&ログに記録することができますか教えていただけますか? – Anita

+0

あなたはどこかに奇妙なことはありませんか? – ontananza

1

メモリの枯渇は、メモリがついになくなった、ではない、それの大部分がどこで使用された場所のみ誤りがわかりますので、デバッグすることは非常に困難です。

あなたはすべてのそのメモリがどこに行った見つけるために、このようXdebugの1つとして、メモリプロファイラを使用することができます。

関連する問題