ホームページ  >  記事  >  バックエンド開発  >  PHPのガベージコレクションメカニズムとは何ですか?

PHPのガベージコレクションメカニズムとは何ですか?

(*-*)浩
(*-*)浩オリジナル
2019-09-24 09:17:143774ブラウズ

PHPのガベージコレクションメカニズムとは何ですか?

PHP ガベージ コレクション メカニズム (ガベージ コレクター、略して GC) PHP では、このオブジェクトを指す変数がない場合、オブジェクトはガベージになります。

PHP はこれをメモリ内で破棄します。これは、メモリ オーバーフローを防ぐための PHP の GC ガベージ処理メカニズムです。 PHP スレッドが終了すると、現在占有されているすべてのメモリ領域が破棄され、現在のプログラム内のすべてのオブジェクトが同時に破棄されます。 (推奨学習: PHP プログラミングの入門から熟練度まで )

GC プロセスは通常、各セッションで実行を開始します。.gc の目的は、セッション ファイルの有効期限が切れた後にセッション ファイルを自動的に破棄および削除することです。 . File.

__destruct /unset __destruct デストラクタは、ガベージ オブジェクトがリサイクルされるときに実行されます。

unset は、オブジェクトではなく、オブジェクトを指す変数を破棄します。

セッションと PHP のガベージ コレクション メカニズム PHP の動作メカニズムにより、セッション情報を定期的にスキャンしてセッション情報が無効かどうかを判断するデーモン スレッドがありません。有効なリクエストが発生すると、PHP はグローバル変数 session.gc_probability および session.gc_divisor の値によって、GC を有効にするかどうかが決まります。

デフォルトでは、session.gc_probability=1、session.gc_divisor =100 は、GC を開始する可能性が 1% であることを意味します (つまり、100 件のリクエストのうち 1 件の gc にのみ、100 件の Started by が伴います)

PHP ガベージ コレクション メカニズムの仕事は、すべてのセッション情報をスキャンし、現在の時刻からセッションの最終変更時刻を減算し、それを session.gc_maxlifetime パラメーターと比較することです。存続する場合 gc_maxlifetime (デフォルトは 24 分) を超えると、セッションは削除されます。

ただし、Web サーバーに複数のサイトがある場合、複数のサイトでセッションを処理するときに GC が予期しない結果を引き起こす可能性があります。その理由は、GC が動作している場合、異なるサイトのセッションが区別されないためです。

それでは、この時点でどのように解決すればよいでしょうか?

session.save_path を変更するか、session_save_path を使用して各サイトのセッションを専用のディレクトリに保存します。

GC の起動速度と、当然のことながら PHP の起動速度を指定します。ガベージ コレクション メカニズム この値を増やすと、それに応じてシステムのパフォーマンスが低下するため、お勧めできません。

コード内で現在のセッションの生存時間を判断し、session_destroyを使用して削除します。

参照カウントの基礎知識

各 PHP 変数は、「zval」と呼ばれる変数コンテナーに存在します。zval 変数コンテナーには、次の型と値が含まれています。変数, これには 2 バイトの追加情報も含まれています。

最初の情報は「is_ref」で、この変数が参照セットに属しているかどうかを識別するために使用されるブール値です。このバイトを通じて、PHP エンジンは通常の変数と参照変数を区別するためです。PHP ではユーザーが & を使用してカスタム参照を使用できるため、メモリ使用量を最適化するために zval 変数コンテナに内部参照カウント メカニズムもあります。2 番目の余分なバイトは "refcount" で、表現するために使用されます。この zval 変数コンテナを指す変数 (シンボルとも呼ばれる) の数。

変数に定数値が割り当てられると、次の例に示すように、zval 変数コンテナが生成されます。

<?php
$a = "new string";
?>

上記の例では、現在のスコープで生成される新しい変数は a で、型が文字列、値が "new string" の変数コンテナが生成されます。 余分な 2 バイトの情報には "is_ref" が含まれますカスタム参照が生成されないため、デフォルトでは false に設定されます。この変数コンテナを使用する変数が 1 つだけであるため、「refcount」は 1 に設定されます。変数の内容を表示するには、xdebug を呼び出します:

<?php
$a = "new string";
xdebug_debug_zval(&#39;a&#39;);
?>

上記のコードは、出力:

a: (refcount=1, is_ref=0)=&#39;new string&#39;

以上がPHPのガベージコレクションメカニズムとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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