91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php垃圾回收機制以及php的編譯原理

發布時間:2020-03-27 11:04:33 來源:億速云 閱讀:641 作者:小新 欄目:編程語言

今天小編給大家分享的是php垃圾回收機制以及php的編譯原理,很多人都不太了解,今天小編為了讓大家更加了解php,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。

php垃圾回收機制以及php的編譯原理

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的編譯原理就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

沽源县| 平度市| 赫章县| 滦南县| 海城市| 浦城县| 明光市| 隆德县| 沐川县| 石城县| 黄陵县| 封开县| 鄂托克前旗| 通榆县| 阜新| 和平区| 昌图县| 合山市| 秦安县| 逊克县| 稻城县| 嵩明县| 晋州市| 杭锦旗| 卢湾区| 拜泉县| 西贡区| 玉屏| 云林县| 英吉沙县| 思南县| 东阳市| 平定县| 宜良县| 乐陵市| 和硕县| 双牌县| 扎赉特旗| 九龙城区| 庆云县| 西和县|