php垃圾回收机制(gc)介绍-php教程

资源魔 32 0

php的编译原理:

ze(zend engine)挪用词法剖析器把php 代码去空格,正文后宰割成一个个token,ze挪用语法剖析器再对token解决构成opcode,opcode以op array方式存正在,ze最初执行op array输入后果。

当一个PHP线程完结时,以后占用的一切内存空间城市被销毁。那末假如这个线程没有完结,怎样收受接管内存呢?

refcount:援用技巧器,能够了解为指向该个容器的指针个数吧。

is_ref:能否被援用(只多是0或许1)

赋值的流程:

<?php

$a = 'aa';
   
xdebug_debug_zval(a);  //(refcount=1, is_ref=0),string 'aa' (length=6)

$b = $a; 

//如下的两个实际上是一个变量容器

xdebug_debug_zval(a); //(refcount=2, is_ref=0),string 'aa' (length=6)
xdebug_debug_zval(b); //(refcount=2, is_ref=0),string 'aa' (length=6)

unset($b);  //对变量容器 refcount 减1xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6)
xdebug_debug_zval(b); //b: no such symbol  b变量被销毁,指向被断掉,假如对应容器的援用技巧为零,那末该块儿内存被收受接管


$b = $a;

$b = 'bb';

xdebug_debug_zval(a); //(refcount=1, is_ref=0),string 'aa' (length=6)
xdebug_debug_zval(b); //(refcount=1, is_ref=0),string 'aa' (length=6)  从新请求一个变量容器存储b,a的变量容器援用减1

援用的流程:

<?php

$a = 'aa';

xdebug_debug_zval('a');  //(refcount=1, is_ref=0),string 'aa' (length=2)

$b = & $a;//变量容器的援用技巧加1,援用标志置为1xdebug_debug_zval('a');  //(refcount=2, is_ref=1),string 'aa' (length=2)
xdebug_debug_zval('b');  //(refcount=2, is_ref=1),string 'aa' (length=2)


$b = '123'; 

//php会发现,该容器变量是援用(is_ref),以是容器变量不必像赋值那样再请求一个

xdebug_debug_zval('a');  //(refcount=2, is_ref=1),string '123' (length=2)
xdebug_debug_zval('b');  //(refcount=2, is_ref=1),string '123' (length=2)


unset($b);//变量容器使用计数减1,援用为零

xdebug_debug_zval('a');  //(refcount=1, is_ref=0),string '123' (length=2)
xdebug_debug_zval('b'); // b: no such symbol

那假如屡次援用,unset掉一个,is_ref能否会被置为零,那样bug没有就呈现了么?变量容器仍是援用啊。那末咱们来看看:

<?php


$a = 'aa';

$b = &$a;
$c = &$a;//能够看到援用refCount是3,is_ref永远是1xdebug_debug_zval('a'); //(refcount=3, is_ref=1),string 'aa' (length=2)
xdebug_debug_zval('b'); //(refcount=3, is_ref=1),string 'aa' (length=2)
xdebug_debug_zval('c'); //(refcount=3, is_ref=1),string 'aa' (length=2)


unset($b);//咱们等待的bug不呈现,只是refcount减1,is_ref仍是1xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2)
xdebug_debug_zval('b'); // b: no such symbol
xdebug_debug_zval('c'); //(refcount=2, is_ref=1),string 'aa' (length=2)

//那php它怎样晓得这个容器另有援用,究竟结果is_ref依然是1,不克不及计数,那末如今refcount就起作用了,是它通知php,该变量有几个援用,但成绩又来了,假如我干点好事,正在援用的时分,又赋值,它会没有会有bug

$e = $a;//咱们看到希冀的bug仍是没呈现,这时候候再赋值,就没有像间接赋值那末简略refcount加1了,而是请求了一个新的变量容器

xdebug_debug_zval('a'); //(refcount=2, is_ref=1),string 'aa' (length=2)
xdebug_debug_zval('e'); //(refcount=1, is_ref=0),string 'aa' (length=2)

unset以及赋值null都能收受接管变量么?不少人都错以为,这两个都能收受接管变量空间,其实错了,null只是把变量占用的空间变小了,从收受接管下去说,该容器仍然存正在。

<?php

$a = 'aa';

$b = $a;

$b = null;

//又请求了一个变量容器
xdebug_debug_zval('a');  //(refcount=1, is_ref=0),string 'aa' (length=2)
xdebug_debug_zval('b');  //(refcount=1, is_ref=0),null   变量空间并没被收受接管

unset($b);

//这时候候才开释了b变量容器的空间
xdebug_debug_zval('a');  //(refcount=1, is_ref=0),string 'aa' (length=2)
xdebug_debug_zval('b');  //b: no such symbol

保举:PHP视频教程

以上就是php渣滓收受接管机制(gc)引见的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!