這里閱讀的php版本為PHP-7.1.0 RC3,閱讀代碼的平臺(tái)為linux
ZTS
我們會(huì)看到文章中有很多地方是:
#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是個(gè)什么概念呢。我們經(jīng)常使用的php都是運(yùn)行在單進(jìn)程,單線程環(huán)境,比如cgi,都是一個(gè)請(qǐng)求進(jìn)來(lái),就一個(gè)進(jìn)程為它服務(wù),當(dāng)請(qǐng)求結(jié)束了,進(jìn)程也就結(jié)束了。所以比如像全局變量,php內(nèi)核就沒(méi)有考慮多線程同時(shí)修改獲取的時(shí)候線程安全問(wèn)題。后來(lái),php漸漸也在往單進(jìn)程多線程服務(wù)器方向發(fā)展。那么這個(gè)時(shí)候,就會(huì)需要有一個(gè)層來(lái)專(zhuān)門(mén)處理線程安全問(wèn)題。這個(gè)就是TSRM(Thread Safe Resource Management)。
但是php默認(rèn)是關(guān)閉線程安全的。在編譯的時(shí)候,你可以指定參數(shù)開(kāi)啟編譯一個(gè)線程安全版本的php。(--enable-maintainer-zts 選項(xiàng), Windows 平臺(tái)為 --enable-zts)這個(gè)就是這里的ZTS的由來(lái)。
比如上面的例子,CG(V) 在非線程安全下獲取的是全局結(jié)構(gòu)compiler_globals結(jié)構(gòu)的v屬性,在線程安全下獲取的是通過(guò)ZEND_TSREMG方法來(lái)獲取。
zend_try
我們會(huì)看到zend_try_catch相關(guān)的代碼如下:
zend_try {
...exec_try
} zend_catch {
...exec_catch
} zend_end_try();