這里閱讀的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默認(rèn)是關(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();

網(wǎng)友評論