php內(nèi)核分析之ZTS和zendtry_第1頁
php內(nèi)核分析之ZTS和zendtry_第2頁
php內(nèi)核分析之ZTS和zendtry_第3頁
php內(nèi)核分析之ZTS和zendtry_第4頁
php內(nèi)核分析之ZTS和zendtry_第5頁
免費預(yù)覽已結(jié)束,剩余2頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、php內(nèi)核分析之ZTS和zendtry在學(xué)習(xí)PHP的同學(xué)對內(nèi)核有沒有疑問呢?下面是精心為大家的php內(nèi)核分析之ZTS和zend_try,希望對大家有幫助,更多內(nèi)容請關(guān)注!這里閱讀的php版本為PHP-7.1.0RC3,閱讀代碼的平臺為linux我們會看到文章中有很多地方是:#ifdefZTS#defineCG(v)ZEND_TSRMG(piler_globals_id,zend_piler_globals* ,v)#else#defineCG(v)(piler_globals.v)externZEND_APIstruct_zend_piler_globalspiler_globals;#end

2、if這里的ZTS是個什么概念呢。我們經(jīng)常使用的php都是運行在單進程,單線程環(huán)境,比如cgi,都是一個請求進來,就一個進程為 它服務(wù),當(dāng)請求結(jié)束了, 進程也就結(jié)束了。 所以比如像全局變量,php內(nèi)核就沒有考慮多線程同時修改獲取的時候線程安全問題。 后來,php漸漸也在往單進程多線程服務(wù)器方向發(fā)展。 那么這個時候, 就會需要 有一個層來專門處理線程安全問題。這個就是TSRM(ThreadSafeResourceManagement。)但是php默認是關(guān)閉線程安全的。在編譯的時候,你可以指定參數(shù)開啟編譯一個線程安全版本的php。(-enable-maintainer-zts選項,Windows平臺

3、為-enable-zts)這個就是這里的ZTS的由來。比如上面的例子,CG(V)在非線程安全下獲取的是全局結(jié)構(gòu)piler_globals結(jié)構(gòu)的v屬性,在線程安全下獲取的是通過ZEND TSREM方法來獲取。zend_try我們會看到zend_try_catch相關(guān)的代碼如下:zend_try.exec_tryzend_catch.exec_catchzend_end_try();把宏展開,我們可以看到大概代碼如下:JMP_BUF*_orig_bailout=EG(bailout);JMP_BUF_bailout;EG(bailout)=&_bailout;if(SETJMP(_bail

4、out)=0).exec_tryelseEG(bailout)=_orig_bailout;.exec_catchEG(bailout)=_orig_bailout;這個是什么意思呢,需要先理解下setjmp和longjmp,這兩個函數(shù)是linux提供的方法。 他們是組合起來使用的, 達到協(xié)同程序的功能#include#includejmp_bufenv;voidfoo()printf(beforejmpn);intret=setjmp(env);if(ret=0)return;else但是php默認是關(guān)閉線程安全的。在編譯的時候,你可以指定printf(return%dn,ret);prin

5、tf(afterjmpn);intmain(intargc,char*argv)foo();longjmp(env,999);return0;/輸出:/*beforejmpreturn999afterjmp*/上面的這個例子,setjmp的時候相當(dāng)于程序片段1把主動權(quán)交出來,然后執(zhí)行if(ret=0)下面的程序,直到遇到longjmp,把執(zhí)行 權(quán)還給了片段1, 并且設(shè)置jmp_buf為999, 片段1繼續(xù)執(zhí)行, 發(fā)現(xiàn) 了ret!=0,就輸出return999。好了,回到這個程序:JMP_BUF*_orig_bailout=EG(bailout);JMP_BUF_bailout;EG(bailo

6、ut)=&_bailout;if(SETJMP(_bailout)=0).exec_tryelseEG(bailout)=_orig_bailout;.exec_catchEG(bailout)=_orig_bailout;這個程序里面的exec_try代碼段里面, 在遇到錯誤的時候, 需要返回的時候,就會包含一個longjmp函數(shù)的調(diào)用。這樣,就形成了 我們平時調(diào)用try.catch.finnal先保存全局變量里面的bailout使用setjmp來做跳轉(zhuǎn)執(zhí)行下面的程序 執(zhí)行exec_try如果exec_try這個代碼段里面有l(wèi)ongjmp,并且longjmp返回非0(一般也確實非0),就執(zhí)行exec_catch的功能:5最后,把全局變量里面的bailout恢復(fù)這里可能會有兩個疑惑, 如果exec_try里面沒有l(wèi)ongjmp怎么辦,那就直接只執(zhí)行了exec_try,就跳過exec_catch了。這個也是 標(biāo)準(zhǔn)的用setjmp和longjmp實

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論