3

私のサーバーでは、次のエラーがあります。

268435456 バイトの許容メモリ サイズを使い果たしました

これはループ( foreach )で発生し、ループ内のメモリ使用量を確認しているときに

memory_get_peak_usage();

7254128268435456疲れ果てていないものを手に入れます!

複数の場所でチェックしましたが、メモリ使用量が大幅に増加していないため、問題がどこにあるのか本当にわかりません!

同じスクリプトがローカル コンピューターで正常に動作しており、メモリ制限をファイル内のみ16Mに設定しました。php.ini

問題の原因となっているコードは次のとおりですが、実際には役に立たないと思います。これは、question2answer オープン ソース プラットフォームのプラグインからのものです。

foreach ($badges as $slug => $info) {
    $badge_name=qa_badge_name($slug);
    if(!qa_opt('badge_'.$slug.'_name')) 
            qa_opt('badge_'.$slug.'_name',$badge_name);
    $name = qa_opt('badge_'.$slug.'_name');
}
4

1 に答える 1

1

あなたの問題は、標準の MySQL コネクタ ライブラリの「機能の誤り」によるものではないかと強く思います。「長い blob」または「長いテキスト」フィールドを含む行がデータベースからフェッチされるとき。MySQL ライブラリは、データに必要な正確なサイズを割り当てる代わりに、行を格納するために必要になる可能性のある最大サイズを割り当てようとします。つまり、4 ギガバイトのメモリです。

これを修正する最も簡単な方法は、この「機能」を持たない MySQL ND コネクタの使用に切り替えることです。

SQL クエリでの PHP の大量のメモリ使用量

67108864 バイトの許容メモリ サイズを使い果たしました

memory_get_peak_usage(); でループ内のメモリ使用量を確認しています。268435456とはかけ離れた7254128を入手!

それは正しいです。メモリ割り当てが失敗しているため、ピークメモリ使用量が使用中の巨大な割り当てを示すことはありません。

ところで、失敗したメモリ割り当てエラーを生成している正確なコード行までエラー メッセージを追跡できたはずです。SQL フェッチが原因でない場合は、答えが間違っている可能性があります。

于 2013-01-16T11:52:43.517 に答える