鍍金池/ 教程/ PHP/ 資源自有的引用計數(shù)
ext_skel生成器
構(gòu)建并編譯一個宿主應(yīng)用
總結(jié)
小結(jié)
小結(jié)
小結(jié)
編譯前的準(zhǔn)備
變量的存儲方式
強制模塊依賴
編譯我們的擴展
庫的查找
讓我們從SAPI開始
Unix/Linux平臺下的編譯
小結(jié)
函數(shù)的參數(shù)
zendparseparameters
PHP語言中的超級全局變量(Superglobals)
同時擴展和嵌入
線程安全
變量的值
啟動與終止的那點事
一個擴展的基本結(jié)構(gòu)
資源自有的引用計數(shù)
小結(jié)
創(chuàng)建PHP變量
有趣的流
一個特殊的參數(shù):return_value
設(shè)置宿主環(huán)境
小結(jié)
關(guān)于生命周期
變量的檢索
內(nèi)存管理
狀態(tài)與屬性讀取
Persistent Resources
Autoconf
小結(jié)
PHP編譯前的config配置
函數(shù)返回值
PHP中的面向?qū)ο螅ㄒ唬?/span>
PHP擴展中的全局變量
嵌入式SAPI
通過嵌入包裝重新創(chuàng)建cli
小結(jié)
在Win32平臺上編譯PHP
小結(jié)
老技術(shù)新用
過濾器
MINFO與phpinfo
zendclassentry
編寫函數(shù)
PHP中的資源類型
實現(xiàn)wrapper
引用計數(shù)
小結(jié)
變量的類型
流的概覽
PHP中的面向?qū)ο螅ǘ?/span>
擴展生成器
覆寫INI_SYSTEM和INI_PERDIR選項
捕獲輸出
小結(jié)
回調(diào)到php中
PHP的啟動與終止
定義一個接口
初始化php
配置編譯環(huán)境
PHP Streams的本質(zhì)
小結(jié)
類的繼承與接口的實現(xiàn)
讀寫ini配置
定義一個類
小結(jié)
PHP的生命周期
流的上下文
引用與函數(shù)的執(zhí)行結(jié)果
類型轉(zhuǎn)換
小結(jié)
Array與HashTable
PECL_Gen
復(fù)合類型的數(shù)據(jù)——資源
小結(jié)
小結(jié)
數(shù)組(C中的)與鏈表
PHP的生命周期
讀寫對象的屬性
PHP變量在內(nèi)核中的實現(xiàn)
Manipulation
高級嵌入式
操作HashTable的API
流式訪問
Arg Info 與類型綁定
小結(jié)
在內(nèi)核中操作PHP語言中數(shù)組
第一個擴展
流的封裝——wrapper
配置和鏈接
流的實現(xiàn)
PHP的生命周期
生成對象的實例與調(diào)用方法
錯誤處理
INI設(shè)置
靜態(tài)編譯
小結(jié)
內(nèi)存管理
Static Stream Operations
常量

資源自有的引用計數(shù)

zval通過引用計數(shù)來節(jié)省內(nèi)存的,這個我們都知道了,但你可能不知道的是,某個zval對應(yīng)的{資源}在實現(xiàn)時也使用了引用計數(shù)這種概念,也就是有了兩種引用計數(shù)!

{資源}對應(yīng)的zval的類型是IS_RESOURCE,它并不保存最終的數(shù)據(jù),而只保存一個數(shù)字,即EG(regular_list)中的數(shù)字索引。

當(dāng){資源}被創(chuàng)建時,比如我們調(diào)用sample_fopen()函數(shù):

$a = sample_fopen('notes.txt', 'r');
//此時:var->refcount__gc = 1, rsrc->refcount = 1

$b = $a;
//此時:var->refcount__gc = 2, rsrc->refcount = 1

unset($b);
//此時:var->refcount__gc = 1, rsrc->refcount = 1

/*
 下面來個復(fù)雜的!
 */

$b = $a;
$c = &$a;
//此時:
/* 
    bvar->refcount = 1, bvar->is_ref = 0
    acvar->refcount = 2, acvar->is_ref = 1
    rsrc->refcount = 2 
*/

現(xiàn)在,如果我們unset($b),內(nèi)核只會把rsrc->refcount的值減1。只有當(dāng)rsrc->refcount的值為0時,我們預(yù)設(shè)的dtor釋放函數(shù)才會被激活并調(diào)用。