7

PHPでのオブジェクトの破壊はどれほど重要ですか?それらを使用した後にPHPでオブジェクトを破棄することは重要ですか?Javaとは異なり、PHPにはガベージコレクターがないためです(私が知っていることは何もありません)

4

5 に答える 5

14

一般的なケースではオブジェクトを破棄する必要はありません。PHPには確かにガベージコレクターがあります。さらに、ほとんどの単純なスクリプトは、HTTPリクエストごとに環境全体が破棄されて再構築されるため、実際には必要ありません。ガベージコレクターは、単一の要求を処理しているときにメモリが不足するスクリプトを支援します。

一般的な場合の例外:

大量のメモリを消費したり、管理されていないリソースをラップしたりするオブジェクトへのすべての参照を「失う」ことが必要になる場合があります。これは通常、

$largeObject = null; // reference to previous value lost

それがへの最後の参照である場合、次のよう$largeObjectになります。

  • PHPはすぐにデストラクタを呼び出します(存在する場合)。スクリプトの有効期間が長い場合は、管理されていないリソース(データベース接続、ソケットなど)をラップしているオブジェクトに対して実行することをお勧めします。
  • オブジェクトが使用するメモリは、ガベージコレクションの対象になります。ただし、収集はその場では発生しませんが、より多くのメモリが必要になる後の時点で発生します(ただしgc_collect_cycles、いつでもガベージコレクションを強制するために呼び出すことができます)。

もちろん、「リクエストを処理してから終了する」という一般的なケースでは、これらすべてが考慮されていません。

于 2012-06-23T15:33:17.523 に答える
2

通常、これは考慮しなければならない問題ではありません。これは、この問題に遭遇した1人の男性に関する記事です。

http://paul-m-jones.com/archives/262

この関数を使用して、クラス内の好きなオブジェクトを破棄できます。

function __destruct()
{
    //do stuff
}

スクリプトが実行されている限り、オブジェクトは、要求の間、またはコマンドラインから呼び出すときにメモリに残ることができます。

于 2012-06-23T15:36:40.973 に答える
0

PHP 5.3の一部であるガベージコレクション(GCとも呼ばれます)メカニズムが組み込まれています。

<?php
    gc_enable(); // Enable Garbage Collector
    var_dump(gc_enabled()); // true
    var_dump(gc_collect_cycles()); // # of elements cleaned up
    gc_disable(); // Disable Garbage Collector
?>

それが役に立てば幸い!:)

于 2012-06-23T15:35:27.297 に答える
0

unsetPHPにはガベージコレクターがありますが、実際には、関数が実行されるまでphpがメモリを解放しない場合が多くあります。これらのケースはシングルトンに関するものであり、xmlはファブリックである可能性があります。私たちの会社では、phpにパッチを適用し、すべてのメモリ割り当てをログに記録し、未設定の関数をコードに追加しました。しかし、Web開発では、これはそれほど重要ではありません。

于 2012-06-23T15:38:37.100 に答える
0

他の人が示唆しているように、ガベージコレクションは実行の最後に機能しますが、cronを長時間実行している場合、大量のデータや巨大な配列を操作していると問題が発生する可能性があります。

この時点での解決策は、オブジェクトで何かを実行したい場合(データベースにデータを保持するなど)に使用できるオブジェクトの魔法の__destruct()関数を呼び出すunset($ object)を使用することです。

于 2012-06-23T15:47:34.100 に答える