问题
上一章说过引用(reference)在php5的时候是一个标志位, 而在php7以后我们把它变成了一种新的类型:is_refernce. 然而引用是一种很常见的应用, 所供电段以这个变化带来了很多的变化, 也给我们在做php7开发的时候, 因为有的时候疏忽忘了处理这个类型, 而带来不少的bug.
最简单的情况, 就是2022年越来越好图片在处理各种类型的时候, 从此以后我们要多考虑这种新的类型, 比如在php7中, 这样的代码形式就变得很常见了:
try_again:swtich (z气体的摩尔体积_type_p(zv)) { ca is_tring: break; ca is_array: break; ... ca is_reference: zv = z_refval_p(zv); //解引用 goto try_again; break;}
如果大家自己写的扩展, 如果忘了考虑这种新的类型, 那么就会导致问题.
为什么?
那么既然这种新类型会带来这么多问题, 那么当时为什么要用把引用变成一种类型呢? 为什么不还是使用一个标志位呢?
一句话来说, 就是我们不得不这么做. -_#
前面说到, hashtable直接存储的是zval, 这样在符号表中, 俩个zval如何共用一个数值呢? 对于字符串等复杂类型来说还好, 我们貌似可以在zend_refcounted结构中加入一个标志位来表明是引用来解决, 然而这个也会遇到change on write带哈尔威来的复制, 但是我们知道在php7中, 一些类型是直接存储在zval中的, 比如is_long, 但是引用类型是需要引用计数的, 那么对于一个是is_long并且又是is_refernce的zval该如何表示呢?
为此, 我们创造了这个新的类型:
如图所示, 引用是一种新的类型:zend_reference, 对于is_refernce类型的zval, zval.value.ref是一个指向zend_reference的指针, 它包含了引用计数和一个zval, 具体的zval的值是存在zval.value.ref->val中的.
所以对于is_long的引用来说, 就用一个类型是is_refernce的zval, 它指向一个zend_reference, 而这个zend_reference->val中是一个类型为is_long的zval.
change on write
php采用引用计数来做简单的垃圾回收, 考虑如下的代码:
<?php1. $val = "laruence";2. $ref = &$val;3. $copy = $val;?>
$ref和$val是指向同一个zval的引用, 在php5的时候, 我们是通过一个引用计数为2, 并且引用标志位为1来表示这种情况, 当把$val复制给$copy(line 3)的时候, 我们发现$val是一个计数大于1的引用, 所以要产生change on write, 也就是分离. 所以我们需要复制这个zval.
而在php7中, 情况就变得简单了很多, 首先在引用赋值给$ref(line 2)的时候, 生成一个is_refernce类型, 然后因为此时有俩个变量引用它所以zend_reference这个结构的引用计数zval.value.ref->gc.refcount为2.
再随后的赋值给$copy(line 3)的时候, 发现$val是一个引用, 于是让$copy指向的是zval.value.ref->val, 也就是字符串值为laruence的zval, 然后把zval的引用计数+1, 也就是zval.value.ref->val.value.str.gc.refcount为2. 并没有产生复制.
从而这就很好的解决了上一章所说的php5的那个经典的问题, 比如我们在php7下运行上一章的那个问题, 我们得到的结果是:
$ php-7.0/sapi/cli/php /tmp/1.php
ud 0.00021380008539
ud 0.00020173048281
可见确实没有发生复制, 从而不会产生任何的性能问题.
以上所述是www.887551.com给大家介绍的php7内核之reference植物描写详解整合,希望对大家有所帮助
本文发布于:2023-04-06 14:49:28,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/919533e39a7392f821288bbad285e46c.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:PHP7内核之Reference详解.doc
本文 PDF 下载地址:PHP7内核之Reference详解.pdf
留言与评论(共有 0 条评论) |