今天小編給大家分享的是php垃圾回收機(jī)制以及php的編譯原理,很多人都不太了解,今天小編為了讓大家更加了解php,所以給大家總結(jié)了以下內(nèi)容,一起往下看吧。一定會有所收獲的哦。
創(chuàng)新互聯(lián)主營西烏珠穆沁網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶APP開發(fā)公司,西烏珠穆沁h(yuǎn)5微信小程序開發(fā)搭建,西烏珠穆沁網(wǎng)站營銷推廣歡迎西烏珠穆沁等地區(qū)企業(yè)咨詢
php的編譯原理:
ze(zend engine)調(diào)用詞法分析器把php 代碼去空格,注釋后分割成一個個token,ze調(diào)用語法分析器再對token處理形成opcode,opcode以op array形式存在,ze最后執(zhí)行op array輸出結(jié)果。
當(dāng)一個PHP線程結(jié)束時,當(dāng)前占用的所有內(nèi)存空間都會被銷毀。那么如果這個線程不結(jié)束,怎么回收內(nèi)存呢?
refcount:引用技術(shù)器,可以理解為指向該個容器的指針個數(shù)吧。
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變量被銷毀,指向被斷掉,如果對應(yīng)容器的引用技術(shù)為零,那么該塊兒內(nèi)存被回收 $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;//變量容器的引用技術(shù)加1,引用標(biāo)記置為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會發(fā)現(xiàn),該容器變量是引用(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);//變量容器應(yīng)用計數(shù)減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不就出現(xiàn)了么?變量容器還是引用啊。那么我們來看看:
<?php $a = 'aa'; $b = &$a; $c = &$a;//可以看到引用refCount是3,is_ref永遠(yuǎn)是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沒有出現(xiàn),只是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,不能計數(shù),那么現(xiàn)在refcount就起作用了,是它告訴php,該變量有幾個引用,但問題又來了,如果我干點壞事,在引用的時候,又賦值,它會不會有bug $e = $a;//我們看到期望的bug還是沒出現(xiàn),這時候再賦值,就不像直接賦值那么簡單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都能回收變量么?很多人都錯認(rèn)為,這兩個都能回收變量空間,其實錯了,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
關(guān)于php垃圾回收機(jī)制以及php的編譯原理就分享到這里了,當(dāng)然并不止以上和大家分析的辦法,不過小編可以保證其準(zhǔn)確性是絕對沒問題的。希望以上內(nèi)容可以對大家有一定的參考價值,可以學(xué)以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
分享題目:php垃圾回收機(jī)制以及php的編譯原理
URL鏈接:http://muchs.cn/article46/ighheg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計、營銷型網(wǎng)站建設(shè)、定制開發(fā)、網(wǎng)站設(shè)計公司、網(wǎng)站維護(hù)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)