2

$domPHP の DOMDocument のインスタンスを含む変数があります。この変数は、ループ内で設定および設定解除されています。

unset($dom)ただし、メモリは解放されませんmemory_get_usage(false)。約 10MB のうち 700B のみが解放されたと報告されています。memory_get_usage(true)の前後でまったく同じ量のメモリ使用量が報告されunset()ます。

私は次のことを試しました:

  • unset()$dom の参照カウントが: xdebug_debug_zval('dom')reports: dom: (refcount=1, is_ref=0)=class DOMDocument { }の呼び出しの直前に正確に 1 であることを確認しました。

  • DOMDocument PHP Memory Leakで提案されている解決策を試しましたが、これは役に立ちませんでした。

  • gc_enable()+を試しgc_collect_cycles()ました。しかし、これも役に立ちませんでした。

  • $dom->__destruct()以前に呼び出してみunset()ましたが、DOMDocument には明らかにデストラクタがないため、エラーが発生します。

  • 変数の設定を解除する前に、DOM 内のすべてのノードを再帰的に削除しました。違いはほとんどありませんでした。

  • 再利用する前に変数をnullに設定してみました:$dom = null

今、私はアイデアがありません...この問題をデバッグまたは解決するために他に何ができるかを提案した人はいますか?

編集:

  • php -v は Suhosin-Patch (cli) で 5.3.10-1ubuntu3.2 を報告します

  • ソースコードはここで見ることができます: https://github.com/jerico-dev/ojs/blob/dev/plugins/generic/lucene/classes/SolrWebService.inc.php#L256

  • 最初の数回の反復の出力は次のとおりです。

    before object creation: 19292296
    after object creation: 29849832
    before unset: 30055232
    after unset: 30054448
    before object creation: 29849592
    after object creation: 39858840
    before unset: 40079920
    after unset: 40079136
    before object creation: 39858272
    after object creation: 49923216
    before unset: 50136448
    after unset: 50135664
    
4

1 に答える 1

1

これにより、$dom のメモリ ストアが解放されます。

$dom = null;
于 2012-07-28T17:28:26.813 に答える