���ü�������֪ʶ

ÿ��php��������һ����"zval"�ı��������С�һ��zval�������������˰������������ͺ�ֵ�������������ֽڵĶ�����Ϣ����һ����"is_ref"���Ǹ�boolֵ��������ʶ��������Ƿ����������ü���(reference set)��ͨ������ֽڣ�php������ܰ���ͨ���������ñ������ֿ���������php�����û�ͨ��ʹ��&��ʹ���Զ������ã�zval���������л���һ���ڲ����ü������ƣ����Ż��ڴ�ʹ�á��ڶ��������ֽ���"refcount"�����Ա�ʾָ�����zval���������ı���(Ҳ�Ʒ��ż�symbol)���������еķ��Ŵ���һ�����ű��У�����ÿ�����Ŷ���������(scope)����Щ���ű�(���磺ͨ�����������ĵĽű�)��ÿ���������߷���Ҳ����������

��һ��������������ֵʱ���ͻ�����һ��zval����������������������

Example #1 ����һ���µ�zval����

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

�������У��µı���a�����ڵ�ǰ�����������ɵġ���������������Ϊ string ��ֵΪnew string�ı����������ڶ���������ֽ���Ϣ�У�"is_ref"��Ĭ������Ϊ FALSE����Ϊû���κ��Զ�����������ɡ�"refcount" ���趨Ϊ 1����Ϊ����ֻ��һ������ʹ�������������. ע�⵽��"refcount"��ֵ��1ʱ��"is_ref"��ֵ����FALSE. ������Ѿ���װ��» Xdebug������ͨ�����ú��� xdebug_debug_zval()��ʾ"refcount"��"is_ref"��ֵ��

Example #2 ��ʾzval��Ϣ

<?php
xdebug_debug_zval
('a');
?>

�������̻������

a: (refcount=1, is_ref=0)='new string'

��һ��������ֵ����һ�������������ô���(refcount).

Example #3 ����һ��zval�����ü���

<?php
$a 
"new string";
$b $a;
xdebug_debug_zval'a' );
?>

�������̻������

a: (refcount=2, is_ref=0)='new string'

��ʱ�����ô�����2����Ϊͬһ���������������� a �ͱ��� b����.��û��Ҫʱ��php����ȥ���������ɵı�������������������"refcount"���0ʱ�ͱ�����. ���κι�����ij�����������ı����뿪����������(���磺����ִ�н���)�����߶Ա��������˺��� unset()ʱ��"refcount"�ͻ��1����������Ӿ���˵��:

Example #4 �������ü���

<?php
$a 
"new string";
$c $b $a;
xdebug_debug_zval'a' );
unset( 
$b$c );
xdebug_debug_zval'a' );
?>

�������̻������

a: (refcount=3, is_ref=0)='new string'
a: (refcount=1, is_ref=0)='new string'

�����������ִ�� unset($a);���������ͺ�ֵ��������������ͻ���ڴ���ɾ����

��������(Compound Types)

�������� array��object�����ĸ�������ʱ���������΢�е㸴��. �� ����(scalar)���͵�ֵ��ͬ��array�� object���͵ı��������ǵij�Ա�����Դ����Լ��ķ��ű��С�����ζ����������ӽ���������zval����������

Example #5 Creating a array zval

<?php
$a 
= array( 'meaning' => 'life''number' => 42 );
xdebug_debug_zval'a' );
?>

�������̵���������ڣ�

a: (refcount=1, is_ref=0)=array (
   'meaning' => (refcount=1, is_ref=0)='life',
   'number' => (refcount=1, is_ref=0)=42
)

ͼʾ:

һ���������zval

������zval����������: a��meaning�� number�����Ӻͼ���"refcount"�Ĺ���������ᵽ��һ��. ����, �����������������һ��Ԫ��,���Ұ�����ֵ��Ϊ�������Ѵ���Ԫ�ص�ֵ:

Example #6 ���һ���Ѿ����ڵ�Ԫ�ص�������

<?php
$a 
= array( 'meaning' => 'life''number' => 42 );
$a['life'] = $a['meaning'];
xdebug_debug_zval'a' );
?>

�������̵���������ڣ�

a: (refcount=1, is_ref=0)=array (
   'meaning' => (refcount=2, is_ref=0)='life',
   'number' => (refcount=1, is_ref=0)=42,
   'life' => (refcount=2, is_ref=0)='life'
)

ͼʾ��

�������õļ������zval

�����ϵ�xdebug�����Ϣ�����ǿ���ԭ�е�����Ԫ�غ�����ӵ�����Ԫ�ع�����ͬһ��"refcount"2��zval��������. ���� Xdebug�������ʾ����ֵΪ'life'�� zval ������������ʵ��ͬһ���� ����xdebug_debug_zval()����ʾ�����Ϣ����������ͨ����ʾ�ڴ�ָ����Ϣ��������

ɾ�������е�һ��Ԫ�أ����������ڴ���������ɾ��һ������. ɾ����,�����е����Ԫ�����ڵ�������"refcount"ֵ���٣�ͬ������"refcount"Ϊ0ʱ��������������ʹ��ڴ��б�ɾ����������һ�����ӿ���˵����

Example #7 ��������ɾ��һ��Ԫ��

<?php
$a 
= array( 'meaning' => 'life''number' => 42 );
$a['life'] = $a['meaning'];
unset( 
$a['meaning'], $a['number'] );
xdebug_debug_zval'a' );
?>

�������̵���������ڣ�

a: (refcount=1, is_ref=0)=array (
   'life' => (refcount=1, is_ref=0)='life'
)

���ڣ����������һ�����鱾����Ϊ��������Ԫ��ʱ������ͱ����Ȥ���¸����ӽ�˵��������������Ǽ��������ò�����������php������һ�����ơ�

Example #8 ��������Ϊһ��Ԫ����ӵ��Լ�

<?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)=...
)

ͼʾ��

������(curcular reference,�Լ����Լ���һ��Ԫ��)�������zval

�ܿ���������� (a) ͬʱҲ���������ĵڶ���Ԫ��(1) ָ��ı���������"refcount"Ϊ 2��������������е�"..."˵�������˵ݹ����, ��Ȼ�������������ζ��"..."ָ��ԭʼ���顣

���ո�һ������һ����������unset����ɾ��������ţ�����ָ��ı��������е����ô���Ҳ��1�����ԣ����������ִ��������Ĵ���󣬶Ա���$a����unset, ��ô���� $a ������Ԫ�� "1" ��ָ��ı������������ô�����1, ��"2"���"1". ��������˵��:

Example #9 Unsetting $a

(refcount=1, is_ref=1)=array (
   0 => (refcount=1, is_ref=0)='one',
   1 => (refcount=1, is_ref=1)=...
)

ͼʾ��

Zvals after removal of array with a circular reference demonstrating the memory leak

�����������������(Cleanup Problems)

���ܲ�����ij���������е��κη���ָ������ṹ(���DZ�������)����������Ԫ��"1"��Ȼָ�����鱾����������������ܱ���� ����Ϊû������ķ���ָ�������û�û�а취�������ṹ������ͻᵼ���ڴ�й©�����ҵ��ǣ�php���ڽű�ִ�н���ʱ���������ݽṹ��������php���֮ǰ�����ķѲ����ڴ档�����Ҫʵ�ַ����㷨������Ҫ��������һ����Ԫ��ָ�����ĸ�Ԫ�����������飬��������ͻᾭ����������Ȼ��ͬ�������Ҳ�ᷢ���ڶ����ϣ�ʵ���϶�����п��ܳ��������������Ϊ����������ʽ�ı����á�

�������������������һ���ε�ûʲô������������ּ�ǧ�Σ�������ʮ��ε��ڴ�й©������Ȼ�Ǹ������⡣�������������������ڳ�ʱ�����еĽű��У�������������ϲ���������ػ�����(deamons)���ߵ�Ԫ�����еĴ���׼�(sets)�С����ߵ����ӣ��ڸ��޴��eZ(һ��֪����PHP Library) ������ģ���������Ԫ����ʱ���Ϳ��ܻ�������⡣��ʱ���Կ�����Ҫ����2GB���ڴ棬�����Է������ܿ���û����ô����ڴ档