ホームページ  >  記事  >  バックエンド開発  >  PHPで再帰メモリを解放する方法

PHPで再帰メモリを解放する方法

(*-*)浩
(*-*)浩オリジナル
2019-10-16 14:38:302199ブラウズ

PHPで再帰メモリを解放する方法

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。