PHP オブジェクトへの再帰参照がある場合、メモリ リークが発生します。このバグは PHP に長い間存在していました。まずこのバグを再現しましょう。コードは次のとおりです:
<?php class Foo { function __construct() { $this->bar = new Bar($this); } } class Bar { function __construct($foo) { $this->foo = $foo; } } for ($i = 0; $i < 100; $i++) { $obj = new Foo(); unset($obj); echo memory_get_usage(), " "; } ?>
上記のコードを実行すると、メモリ使用量は変わらないはずであることがわかりますが、実際にはしかし、増加し続けるため、設定を解除しても完全には効果がありません。
現在の開発の多くはフレームワークに基づいています。アプリケーションには複雑なオブジェクトの関係があるため、このような問題が発生する可能性があります。どのような対処法ができるかを見てみましょう:
<?php class Foo { function __construct() { $this->bar = new Bar($this); } function __destruct() { unset($this->bar); } } class Bar { function __construct($foo) { $this->foo = $foo; } } for ($i = 0; $i < 100; $i++) { $obj = new Foo(); $obj->__destruct(); unset($obj); echo memory_get_usage(), " "; } ?>
幸いなことに、これはPHP5.3のCVSコードのバグを修正しました。
再帰の終了条件には、一般にさまざまな方法があります:
1. 再帰関数のパラメーターに再帰の深さパラメーターを追加します
深さ各呼び出しの 1 つ追加し、関数本体に条件ステートメントを追加し、深さが特定の値を超えたときに強制的にリターンします;
2. 要素スタック構造と、記録する必要があるいくつかの内容を紹介します。通常、各再帰は stack にプッシュされ、適切な場合にポップアップ表示されます。
関数本体に条件ステートメントを追加してスタック サイズまたはスタック要素を決定し、条件が満たされた場合に戻ります。
以上がPHPで再帰メモリを解放する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。