php内核分析之ZTS和zendtry_第1页
php内核分析之ZTS和zendtry_第2页
php内核分析之ZTS和zendtry_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、php 内核分析之ZTS和 zendtry在学习 PHP的同学对内核有没有疑问呢 ?下面是精心为大家的 php 内核分析之 ZTS和 zend_try ,希望对大家有帮助, 更多内容请关注!这里阅读的 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_globalspil

2、er_globals;#endif这里的 ZTS是个什么概念呢。我们经常使用的php 都是运行在单进程,单线程环境,比如cgi ,都是一个请求进来,就一个进程为它服务,当请求结束了, 进程也就结束了。 所以比如像全局变量, php内核就没有考虑多线程同时修改获取的时候线程安全问题。后来,php渐渐也在往单进程多线程服务器方向发展。那么这个时候, 就会需要有一个层来专门处理线程安全问题。这个就是TSRM(ThreadSafeResourceManagement)。但是 php 默认是关闭线程安全的。在编译的时候,你可以指定参数开启编译一个线程安全版本的php。(-enable-maintaine

3、r-zts选项, Windows平台为 -enable-zts)这个就是这里的ZTS的由来。比如上面的例子, CG(V)在非线程安全下获取的是全局结构piler_globals结构的 v 属性,在线程安全下获取的是通过ZEND_TSREMG方法来获取。zend_try我们会看到 zend_try_catch相关的代码如下:zend_try.exec_tryzend_catch.exec_catchzend_end_try();把宏展开,我们可以看到大概代码如下:JMP_BUF*_orig_bailout=EG(bailout);JMP_BUF_bailout;EG(bailout)=&

4、_bailout;if(SETJMP(_bailout)=0).exec_tryelseEG(bailout)=_orig_bailout;.exec_catchEG(bailout)=_orig_bailout;这个是什么意思呢,需要先理解下setjmp 和 longjmp ,这两个函数是 linux提供的方法。他们是组合起来使用的, 达到协同程序的功能#include#includejmp_bufenv;voidfoo()printf("beforejmpn");intret=setjmp(env);if(ret=0)return;elseprintf("re

5、turn%dn",ret);printf("afterjmpn");intmain(intargc,char*argv)foo();longjmp(env,999);return0;/ 输出:/*beforejmpreturn999afterjmp*/上面的这个例子, setjmp 的时候相当于程序片段 1 把主动权交出来,然后执行 if(ret=0) 下面的程序,直到遇到 longjmp ,把执行权还给了片段 1,并且设置 jmp_buf 为 999,片段 1 继续执行,发现了 ret!=0 ,就输出 return999 。好了,回到这个程序 :JMP_BUF*

6、_orig_bailout=EG(bailout);JMP_BUF_bailout;EG(bailout)=&_bailout;if(SETJMP(_bailout)=0).exec_tryelseEG(bailout)=_orig_bailout;.exec_catchEG(bailout)=_orig_bailout;这个程序里面的exec_try代码段里面,在遇到错误的时候, 需要返回的时候,就会包含一个longjmp 函数的调用。这样,就形成了我们平时调用 try.catch.finnal的功能:1 先保存全局变量里面的 bailout2 使用 setjmp 来做跳转执行下面的程序3 执行 exec_try4 如果 exec_try 这个代码段里面有 longjmp ,并且 longjmp 返回非 0( 一般也确实非 0) ,就执行 exec_catch5 最后,把全局变量里面的 bailout 恢复这里可能会有两个疑惑, 如果 exec_try里面没有 longjmp 怎么办,那就直接只执行了exec_try ,就跳过 exec_catch 了。这个也是标准的用 setjmp 和 longjmp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论