這里閱讀的php版本為PHP-7.1.0 RC3,閱讀代碼的平臺為linux
ZTS
我們會看到文章中有很多地方是:
#ifdef ZTS # define CG(v) ZEND_TSRMG(compiler_globals_id, zend_compiler_globals *, v) #else # define CG(v) (compiler_globals.v) extern ZEND_API struct _zend_compiler_globals compiler_globals; #endif
這里的ZTS是個什么概念呢。我們經(jīng)常使用的php都是運行在單進程,單線程環(huán)境,比如cgi,都是一個請求進來,就一個進程為它服務(wù),當(dāng)請求結(jié)束了,進程也就結(jié)束了。所以比如像全局變量,php內(nèi)核就沒有考慮多線程同時修改獲取的時候線程安全問題。后來,php漸漸也在往單進程多線程服務(wù)器方向發(fā)展。那么這個時候,就會需要有一個層來專門處理線程安全問題。這個就是TSRM(Thread Safe Resource Management)。
但是php默認是關(guān)閉線程安全的。在編譯的時候,你可以指定參數(shù)開啟編譯一個線程安全版本的php。(--enable-maintainer-zts 選項, Windows 平臺為 --enable-zts)這個就是這里的ZTS的由來。
比如上面的例子,CG(V) 在非線程安全下獲取的是全局結(jié)構(gòu)compiler_globals結(jié)構(gòu)的v屬性,在線程安全下獲取的是通過ZEND_TSREMG方法來獲取。
zend_try
我們會看到zend_try_catch相關(guān)的代碼如下:
zend_try {
...exec_try
} zend_catch {
...exec_catch
} zend_end_try();
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉(zhuǎn)無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來看看(二) 2017-07-26