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

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

醉折花枝作酒筹
醉折花枝作酒筹転載
2021-07-02 09:13:251863ブラウズ

php5 と php7 のガベージ コレクション メカニズムはすべて参照カウントを使用します。PHP は C で書かれているため、C には構造体と呼ばれるものがあります。PHP 変数はこの方法で C に保存されます。今日は、PHP5 と PHP7 のガベージ コレクション メカニズムの違いを学びます。

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

php5 と php7 のガベージ コレクション メカニズムは両方とも参照カウントを使用します

まず参照カウントとは何かを見てみましょう:

PHP は C で書かれているため、C には構造体と呼ばれるものがあります。PHP 変数は、C ではこの方法で保存されます。

各 PHP 変数は、zval コンテナーの中の、 zval コンテナには、変数名と値が含まれるだけでなく、2 バイトの追加情報も含まれています。1 つは「is_ref」と呼ばれ、変数が参照セットに属しているかどうかを示すために使用されるブール値です。このバイトを通じて、 PHP では、通常の変数と参照変数を区別できますか。2 番目の余分なバイトは 'refcount' で、このコンテナを指す変数の数を示すために使用されます

PHP で変数を定義します

$name='看看';

xdebug_debug_zval() 関数を使用して、関数内の変数に関する関連情報を取得できるようになりました。

xdebug_debug_zval('name');
//输出 name:(refcount=1,is_ref=0)='new String'
现在我们把$name赋值给$money
$money = $name;

もう一度確認してみましょう:

xdebug_debug_zval('name');
//输出 name:(refcount=2,is_ref=0)='new String'

この時点で、refcount フィールドの値が表示されます。 1 を追加しました (これは、2 つの既存の変数が name という名前の同じ aval コンテナーを指していることを意味します)

参照カウントのルールに従って、refcount=0 の場合、PHP はこのコンテナーをガベージとして扱います。

#同様に、

unset($name); //一样也会把name容器的引用计数设置为0

を実行します。

上記の結論はスカラー型のみに当てはまります。型を担当する

配列を見てみましょう:

$person=['name'=>'请欢','age'=>19];
var_dump(xdebug_debug_zval('person'));
在PHP5输出:
person:
(refcount=1, is_ref=0),
array (size=2)
  'name' => (refcount=1, is_ref=0),string '看看' (length=6)
  'age' => (refcount=1, is_ref=0),int 19

PHP7 での出力:

person:
(refcount=2, is_ref=0)
array (size=2)
  'name' => (refcount=1, is_ref=0)string '看看' (length=6)
  'age' => (refcount=0, is_ref=0)int 19

複雑なデータ型の場合、PHP5 と PHP7 の参照カウント アルゴリズムが異なることがわかります

ループを試してみましょう引用文

上記のコードに基づいて、次のコード行を追加します。

$person['hello'] = $person['name']

PHP7 での出力:

person:
(refcount=1, is_ref=0)
array (size=3)
  'name' => (refcount=3, is_ref=0)string '看看' (length=6)
  'age' => (refcount=0, is_ref=0)int 19
  'hello' => (refcount=3, is_ref=0)string '看看' (length=6)

PHP5 での出力:

person:
(refcount=1, is_ref=0),
array (size=3)
  'name' => (refcount=2, is_ref=0),string '看看' (length=6)
  'age' => (refcount=1, is_ref=0),int 19
  'hello' => (refcount=2, is_ref=0),string '看看' (length=6)

短い概要:

PHP5 と PHP7 のガベージ コレクション メカニズムはどちらも参照カウントに属しますが、複雑なデータ型のアルゴリズム処理に関しては次のようになります。

PHP7 では、zval が新しい実装になりました。最も基本的な変更は、*zval で必要なメモリがヒープとは別に割り当てられなくなり、参照カウントが単独で格納されなくなったことです。複雑なデータ型 (文字列、配列、オブジェクトなど) の参照カウントは、それ自体で保存されます。この実装には次の利点があります: *

*単純なデータ型はメモリを個別に割り当てる必要がなく、カウントする必要もありません。*

*二重にカウントされることはなくなります。オブジェクトでは、オブジェクト自体に保存されているカウントのみが有効です。*

*カウントは値自体によって保存されるため、zval 間など、非 zval 構造内のデータと共有できます。およびハッシュテーブル キー; *

推奨学習: php ビデオ チュートリアル

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

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。