麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > PHP > 正文

深入理解PHP7內核之Reference

2020-03-22 19:58:21
字體:
來源:轉載
供稿:網友
之前說過引用(REFERENCE)在PHP5的時候是一個標志位, 而在PHP7以后我們把它變成了一種新的類型:IS_REFERNCE. 然而引用是一種很常見的應用, 所以這個變化帶來了很多的變化, 也給我們在做PHP7開發(fā)的時候, 因為有的時候疏忽忘了處理這個類型, 而帶來不少的bug.

最簡單的情況, 就是在處理各種類型的時候, 從此以后我們要多考慮這種新的類型, 比如在PHP7中, 這樣的代碼形式就變得很常見了:

try_again:swtich (Z_TYPE_P(zv)) { case IS_TRING: break; case IS_ARRAY: break; case 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該如何表示呢?

為此, 我們創(chuàng)造了這個新的類型:

229cab31e1e257f0456f8c381be49ab.png

如圖所示, 引用是一種新的類型:zend_reference, 對于IS_REFERNCE類型的zval, zval.html' target='_blank'>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)的時候, 我們發(fā)現$val是一個計數大于1的引用, 所以要產生Change on write, 也就是分離. 所以我們需要復制這個zval.

而在PHP7中, 情況就變得簡單了很多, 首先在引用賦值給$ref(line 2)的時候, 生成一個IS_REFERNCE類型, 然后因為此時有倆個變量引用它所以zend_reference這個結構的引用計數zval.value.ref- gc.refcount為2.

再隨后的賦值給$copy(line 3)的時候, 發(fā)現$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.phpUsed 0.00021380008539Used 0.00020173048281

可見確實沒有發(fā)生復制, 從而不會產生任何的性能問題.

推薦:《PHP教程》

以上就是深入理解PHP7內核之Reference的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 中日韩乱码一二新区 | 日韩视频中文 | 国产亚洲精品久久久久婷婷瑜伽 | 国产美女爽到喷白浆的 | 99国产精成人午夜视频一区二区 | 在线中文字幕观看 | 亚洲一区二区三区四区精品 | 72pao成人国产永久免费视频 | 免费看黄色三级毛片 | 中文字幕在线免费看 | 国产一区二区视频精品 | 国产做爰 | 国产99精品 | av手机在线免费播放 | 中国hdxxxx护士爽在线观看 | 毛片视频网址 | 九九热视频免费 | 91精品观看91久久久久久国产 | 热99精品视频 | 亚洲国产午夜精品 | 黄色二区三区 | 色视频一区二区 | 国产污污视频 | 中文字幕在线观看国产 | 看国产一级毛片 | 国产亚洲精品综合一区91555 | 欧美亚洲一级 | 91网站永久免费看 | 99爱视频 | 黄色毛片视频在线观看 | 黄色毛片前黄 | 国产日韩精品欧美一区视频 | 老子午夜影院 | 精品久久久久久成人av | av在线免费看网站 | 久久777国产线看观看精品 | 爱性久久久久久久 | 亚洲欧美国产精品va在线观看 | 成年人视频在线免费播放 | 国产免费让你躁在线视频 | 免费在线中文字幕 |