PHPでのオブジェクトの破壊はどれほど重要ですか?それらを使用した後にPHPでオブジェクトを破棄することは重要ですか?Javaとは異なり、PHPにはガベージコレクターがないためです(私が知っていることは何もありません)
5 に答える
一般的なケースではオブジェクトを破棄する必要はありません。PHPには確かにガベージコレクターがあります。さらに、ほとんどの単純なスクリプトは、HTTPリクエストごとに環境全体が破棄されて再構築されるため、実際には必要ありません。ガベージコレクターは、単一の要求を処理しているときにメモリが不足するスクリプトを支援します。
一般的な場合の例外:
大量のメモリを消費したり、管理されていないリソースをラップしたりするオブジェクトへのすべての参照を「失う」ことが必要になる場合があります。これは通常、
$largeObject = null; // reference to previous value lost
それがへの最後の参照である場合、次のよう$largeObject
になります。
- PHPはすぐにデストラクタを呼び出します(存在する場合)。スクリプトの有効期間が長い場合は、管理されていないリソース(データベース接続、ソケットなど)をラップしているオブジェクトに対して実行することをお勧めします。
- オブジェクトが使用するメモリは、ガベージコレクションの対象になります。ただし、収集はその場では発生しませんが、より多くのメモリが必要になる後の時点で発生します(ただし
gc_collect_cycles
、いつでもガベージコレクションを強制するために呼び出すことができます)。
もちろん、「リクエストを処理してから終了する」という一般的なケースでは、これらすべてが考慮されていません。
通常、これは考慮しなければならない問題ではありません。これは、この問題に遭遇した1人の男性に関する記事です。
http://paul-m-jones.com/archives/262
この関数を使用して、クラス内の好きなオブジェクトを破棄できます。
function __destruct()
{
//do stuff
}
スクリプトが実行されている限り、オブジェクトは、要求の間、またはコマンドラインから呼び出すときにメモリに残ることができます。
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
?>
それが役に立てば幸い!:)
unset
PHPにはガベージコレクターがありますが、実際には、関数が実行されるまでphpがメモリを解放しない場合が多くあります。これらのケースはシングルトンに関するものであり、xmlはファブリックである可能性があります。私たちの会社では、phpにパッチを適用し、すべてのメモリ割り当てをログに記録し、未設定の関数をコードに追加しました。しかし、Web開発では、これはそれほど重要ではありません。
他の人が示唆しているように、ガベージコレクションは実行の最後に機能しますが、cronを長時間実行している場合、大量のデータや巨大な配列を操作していると問題が発生する可能性があります。
この時点での解決策は、オブジェクトで何かを実行したい場合(データベースにデータを保持するなど)に使用できるオブジェクトの魔法の__destruct()関数を呼び出すunset($ object)を使用することです。