この記事の内容は、PHP における参照の解析とガベージ コレクションに関するもので、一定の参考価値があります。困っている友人は参考にしていただければ幸いです。
各 PHP 変数は、「zval」という変数コンテナーに存在します。 zval 変数コンテナには、変数の型と値に加えて、2 バイトの追加情報が含まれています。 1 つ目は「is_ref」で、この変数が参照セットに属しているかどうかを識別するために使用されるブール値です。このバイトを通じて、PHP エンジンは通常の変数と参照変数を区別できます。PHP ではユーザーが & を使用してカスタム参照を使用できるため、zval 変数コンテナにはメモリ使用量を最適化するための内部参照カウント メカニズムもあります。 2 番目の追加バイトは「refcount」で、この zval 変数コンテナーを指す変数 (シンボルとも呼ばれます) の数を示すために使用されます。すべてのシンボルはシンボル テーブルに存在し、各シンボルにはスコープ (スコープ) があり、メイン スクリプト (例: ブラウザを通じて要求されたスクリプト)、および各関数またはメソッドにもスコープがあります。
//php 内のオブジェクトは参照によって渡されます
is_ref = 0, refcount = 0 zval コンテナーはスクリプト実行の最後に破棄されます
公式の例からの引用
<?php $a = array( 'one' ); $a[] =& $a; xdebug_debug_zval( 'a' );
a: (refcount=2, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=2, is_ref=1)=... )
unset$a を実行すると、変数と zval の間のメモリの関連付けが解放されますが、閉じたループ自体はまだ存在します
(refcount=1, is_ref=1)=array ( 0 => (refcount=1, is_ref=0)='one', 1 => (refcount=1, is_ref=1)=... )
ただし、現時点では zval に操作できる変数はありません。コンテナ時間はメモリのゴミになっているため、解放できません。
リサイクル メカニズム:簡単に言うと、スクリプト実行後、残りのExisting変数はデータ全体のrefcountすべてに-1が使用され、0になるとゴミと判断されメモリコンテナが破棄されます。
関連する推奨事項:PHP のガベージ コレクション メカニズムではどのような種類のガベージをリサイクルできますか? ガベージ コレクションではガベージをリサイクルできません
以上がPHPでの参照とガベージコレクションの分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。