참조 카운팅에 대한 기본 지식 공식 홈페이지의 답변은 다음과 같습니다
각 PHP 변수는 "zval"이라는 변수 컨테이너에 존재합니다.
zval 변수 컨테이너의 유형과 값 외에 변수에는 2바이트의 추가 정보 is_ref
도 포함되며 refcount
is_ref
和 refcount
is_ref
是个bool值,用来标识这个变量是否是属于引用集合(reference set)。通过这个字节,php引擎才能把普通变量和引用变量区分开来
refcount
is_ref
는 이 변수가 속하는지 여부를 식별하는 데 사용되는 부울 값입니다. 참조 세트(참조 세트). 이 바이트를 통해 PHP 엔진은 일반 변수와 참조 변수를 구별할 수 있습니다.refcount
는 이 zval 변수 컨테이너를 가리키는 변수의 수를 나타내는 데 사용됩니다.
PHP5 참조
PHP5에서 zval 메모리는 힙(몇 가지 예외 제외)과 별도로 할당되며, PHP는 어떤 zval이 사용 중이고 어떤 zval을 해제해야 하는지 알아야 합니다. 따라서 이를 위해서는 참조 계산을 사용해야 합니다. zval의 refcount__gc 값은 zval 자체가 참조된 횟수를 저장하는 데 사용됩니다(예:<?php //php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3); xdebug_debug_zval('a'); xdebug_debug_zval('b'); xdebug_debug_zval('c'); xdebug_debug_zval('d'); xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果如下 a:(refcount=2, is_ref=1),int 1b:(refcount=2, is_ref=0),int 1c:(refcount=2, is_ref=1),int 1d:(refcount=2, is_ref=0),int 1e:(refcount=1, is_ref=0), array (size=4) 0 => (refcount=1, is_ref=0),int 0 1 => (refcount=1, is_ref=0),int 1 2 => (refcount=1, is_ref=0),int 2 3 => (refcount=1, is_ref=0),int 3
각 변수에는 고유한 번호가 있습니다
zval in PHP7. 이 구현에는 다음과 같은 이점이 있습니다.
간접에 필요한 포인터 수 액세스가 줄어듭니다
<?php //php zval变量容器$a = 1;$b = 1;$c = &$a;$d = $b;$e = range(0, 3); xdebug_debug_zval('a'); xdebug_debug_zval('b'); xdebug_debug_zval('c'); xdebug_debug_zval('d'); xdebug_debug_zval('e'); >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 结果如下 a:(refcount=2, is_ref=1)int 1b:(refcount=0, is_ref=0)int 1c:(refcount=2, is_ref=1)int 1d:(refcount=0, is_ref=0)int 1e:(refcount=1, is_ref=0)array (size=4) 0 => (refcount=0, is_ref=0)int 0 1 => (refcount=0, is_ref=0)int 1 2 => (refcount=0, is_ref=0)int 2 3 => (refcount=0, is_ref=0)int 3
일반 변수는 더 이상 자신의 숫자를 기억하지 않습니다. 배열과 같은 복잡한 유형은 자신의 숫자를 기억합니다.
가비지란 무엇입니까간단히 말하면, 이 zval의 각 요소에 대해 refcount 빼기 1 작업을 수행하는 것입니다. 작업이 완료된 후 zval의 refcount가 0이면 이 zval은 가비지입니다.
위 내용은 PHP 가비지 수집 메커니즘을 마스터하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!