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开发自学