5

以下のコードのようなノードのツリー構造を使用している場合、循環参照について心配する必要はありますか?
PHP はメモリ割り当てメカニズムを使用しており、循環参照が関係している場合、ガベージ コレクタの動作が非常に困難になる可能性があることを読みました。

私が知りたいのは:

  • ツリーが少数のノード (たとえば 25 個) だけで構成されている場合、これは問題になりますか?
  • メモリはスクリプトの最後に解放されますか、それともサーバーに問題を徐々に引き起こしていますか?
  • この問題は、スクリプトの実行中にどのような状況で影響を及ぼしますか?
  • 参照を手動で破棄すると問題は解決しますか?常にそうする必要がありますか?
class Node {
    private $parent;
    private $children;

    function addChild( Node $child ) {
        $this->children[] = $child;
        $child->setParent( $this );
    }

    function setParent( $parent ) {
        $this->parent = $parent;
    }
}

//eg
$node0 = new Node;
$node1 = new Node;

// nodes 1 and 2 have a circular reference to each other
$node0->addChild( $node1 );
4

4 に答える 4

4

ポイントごと:

  • 私のツリーが少数のノード、たとえば25だけで構成されている場合、これは問題ですか?

あなたのノードが本物のモンスターでない限り、そうではありません。

  • スクリプトの最後にメモリが解放されますか、それともサーバーに問題が発生しますか?

インタプリタがシャットダウンすると、すべてのメモリが解放されます。

  • この問題は、スクリプトの実行中にどのような状況で影響しますか?

メモリ制限が非常に低いか、動的データ構造が非常に大きい場合を除いて、心配する必要はありません。頻繁に作成/解放されていない25個のノードがある場合、問題は発生しません。

  • 参照を手動で破棄することで問題は解決しますか?常にそれを行う必要がありますか?

それが役立ちます。Propelを使用してデータベースに大きなデータセットをロードすると、循環参照が解放されないことを追跡したメモリ消費に関する多くの問題が発生しました。私たちの解決策は、すべての参照をクリアするメソッドを呼び出すことでした。

于 2009-02-09T22:21:14.157 に答える
3

PHP 5.3には、循環参照の検出および破棄機能が含まれます。これはオプションの設定であり、ガベージコレクターはパフォーマンスに影響を与えるため、必要な場合にのみ使用する必要がありますが、例に合わせて作成されています。

今すぐ開発し、__ destruct()メソッドで明示的に逆参照するように注意し、可能な場合は5.3にアップグレードしてください。

于 2009-02-09T22:53:19.290 に答える
3

そうかもしれませんが、(キャッシュしていない限り) すべてのリクエストの最後にすべてのオブジェクトをスローするため、多くの PHP プログラマーがこれについて心配することはないと思います。

PHP でコマンド ライン スクリプトを作成している場合、それについて心配するケースがあるかもしれませんが、心配する価値のあるものになる前に、かなり複雑な PHP コードを作成する必要があります。もしそうなら、あなたはより大きな問題を抱えています。

幸運を。

于 2009-02-09T22:00:49.680 に答える
2

ほとんどの PHP ページの性質 (つまり、プロセスは Web ページに対して実行され、完了時に破棄される) を考えると、これが問題であるとは思えません。以前に循環参照の問題を見たことがなく、問題なく使用しています。私の経験では、単にメモリを消費するだけでより多くの問題が発生しますが、PHP 5 では、別段の指示がない限り、オブジェクトと配列をコピーするだけでなく、それを多少軽減しています。

于 2009-02-09T22:04:10.080 に答える