2012-02-09 10 views
0

これはかなり議論されているようです。私は見つけたいくつかのことを試しましたが、運はありません。PHP - 彗星のメモリの問題

XMLコールから受け取ったオブジェクトを格納する「ハッキー」キャッシュが構築されています。 XML呼び出しはページの読み込みに時間がかかることが判明したため、ユーザーは管理者のボタンを押してキャッシュを再構築できます。キャッシュルーチンは、メモリ割り当てエラーで死にかけています。

私はこれが非常に曖昧な質問であることは知っていますが、コードの大きな部分を投稿するのに役立つかどうかはわかりません。

私はそれを使用し終えた後、私はすべての設定を解除しています。私はgc_collect_cycles()を呼び出していますが、何もしないようです。

私は2つ以上の匿名関数を呼び出しています。これらは犯人かもしれませんか?

どうすればよいですか?睡眠をしても助けてくれませんか? http://pastebin.com/8M1Dk73E

ペーストビンコードの行79には、私が呼んでいるgc_collect_cycles:ここにコードを編集

はコードです。それが置けるかどうかは分かりません。

forループの代わりにforeachループを使用していますが、私はオブジェクトのコピーに大きな違いがあることを知っていますが、実行時間が長くても同じ変数を設定しなければならないと思います。

まあ、私は迷っているので、どんな考えが役に立ちます。

+0

いくつかの質問:どのくらいのメモリがPHPに割り当てられていますか?エラーメッセージを印刷できますか?アイテムをフェッチする順序を変更しながら10回実行すると、同じ行番号(これは大きなメモリ・グラブの原因となるコードである可能性が高いという印)で一般に期限切れになりますか?それは実際にコードの大きな塊を参照するのに役立つかもしれません:) –

+0

128MBが割り当てられます、エラー: "致命的なエラー:134217728バイトの枯渇(5426168バイトを割り当てようとしました)の許容メモリサイズ..."私はコードが関連していることを認めてうれしく思います...私はちょうどメモリを解放するために他に何をするのか分かりません。これは、私が言うことができるものではありません。ああ、メモリサイズを増やして、それを1日と呼びます。検索されるデータのサイズは、一部の人にとって大規模なものになる可能性があるためです。 –

答えて

1

これはgc_collect_cyclesに関連している可能性があります。 https://bugs.php.net/bug.php?id=53803https://bugs.php.net/bug.php?id=53071

もし可能であれば、PHPを5.3.9にアップデートし、動作するか試してみてください。そうでない場合は、コレクションを削除し、排他的にunset()に頼ってください(グローバル変数の設定を解除すると関数内でのみ変数が破壊されることに注意してください)、すべての場所を破壊したい場合は、$ GLOBALS配列から設定を解除する必要があります。

メモリが不足している場合は、memory_get_usage()を使用してメモリを必要以上に移動させ、メモリを解放してください。何かのように:

try{ 
    $result = $client->GetListingPhotosWithFullPath(array('mlsID'=>$bid->MlsID, 'mlsNumber'=>$bid->MlsNumber)); 
    echo "Got Photos with Full Path on line ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
    $listing->photos = $result->GetListingPhotosWithFullPathResult->Photo; 
    echo "Setting $listing->photos on ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
    (isset($opt->comet)) ? $msg("Photos received.") : ''; 

    //Memory Cleanup 
    unset($result); 
    echo "\$result unseet on ".__LINE__." - Now using ".memory_get_usage()."<br />\n"; 
} 

これはあなたのサイクルがメモリを構築している場所を確認する必要があります。

+0

まあ、私はまだ立ち往生していますが、これは別の質問だと思います。私は最終的にファイルに書き込む配列を構築することでメモリの問題が発生します。明らかに私が全体を取得してファイルに書き込むのに十分長い間、メモリ内に配列を保持することはできません。 :( –

+0

配列全体を保持するのではなく、少しずつファイルを構築してみることができますか? 'file_put_contents($ filename、$ data、FILE_APPEND);'そしてそのデータの設定を解除しますか? –