版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
php内核分析之扩展以下是精心为大家的关于 php内核扩展方面的分析,欢迎阅读参考!更多内容请关注!这里阅读的php版本为,阅读代码的平台为 linux。我们研究下反射这个扩展。反射这个扩展目录是存在在: ext/reflection 。其实里面的代码很简单。一个.h文件,一个.c文件。我们先看下.c文件中,会看到很多 ZEND_METHODZEND_METHOD(reflection_function,getReturnType){...}对应的宏:#defineZEND_METHOD(classname,name)ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name))#defineZEND_NAMED_FUNCTION(name)voidname(INTERNAL_FUNCTION_PARAMETERS)#defineZEND_MN(name)zim_##name#defineINTERNAL_FUNCTION_PARAMETERSzend_execute_data*execute_data,zval*return_value这里的##代表的是连接,展开实际上就是:voidzim_reflection_function_getReturnType(zend_execute_data*execute_data,zval*return_value)总而言之,我们这里是使用 ZEND_METHOD定义了一个函数zim_reflection_function_getReturnType ,那从执行代码是怎么调用到这里的呢?好吧,所以我们这里是看不到扩展的调用堆栈的。 那我们用gdb看下调用堆栈。写个使用反射扩展的脚本:123classB4{5publicfunctiontest():B6{78}9}1011functiongetB():B12{1314}1516$rc=newReflectionMethod('B','test');17var_dump((string)$rc->getReturnType(),$rc->getReturnType());1819$rc=newReflectionFunction('getB');20var_dump((string)$rc->getReturnType(),$rc->getReturnType());使用gdb进行打点,我们看了下 getReturnType的扩展定义,里面有个在扩展代码中的函数 reflection_type_factory ,就使用这个打点了。(gdb)breflection_type_factory(gdb)run-f/home/xiaoju/software/php7/demo/echo.php(gdb)s(gdb)bt#0reflection_type_factory(fptr=0x7ffff6004210,closure_object=0x0,arg_info=0x7ffff6079048,object=0x7ffff60140d0)at/home/xiaoju/webroot/php-src/php-src-master/ext/reflection/php_reflection.c:1280#10x0000000000760d23inZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER(execute_data=0x7ffff6014030)at/home/xiaoju/webroot/php-src/php-src-master/Zend/zend_vm_execute.h:1097#20x000000000073fc88inexecute_ex(ex=)at/home/xiaoju/webroot/php-src/php-src-master/Zend/zend_vm_execute.h:432#30x000000000078b670inzend_execute(op_array=0x7ffff60782a0,return_value=)at/home/xiaoju/webroot/php-src/php-src-master/Zend/zend_vm_execute.h:474#40x00000000006e48a3inzend_execute_scripts(type=8,retval=0x0,file_count=3)at/home/xiaoju/webroot/php-src/php-src-master/Zend/zend.c:1464#50x0000000000684870inphp_execute_script(primary_file=0x7fffffffe090)at/home/xiaoju/webroot/php-src/php-src-master/main/main.c:2541#60x000000000078e9eaindo_cli(argc=3,argv=0xee1bc0)at/home/xiaoju/webroot/php-src/php-src-master/sapi/cli/php_cli.c:994#70x000000000078f1eainmain(argc=3,argv=0xee1bc0)at/home/xiaoju/webroot/php-src/php-src-master/sapi/cli/php_cli.c:1387(gdb)好了,很清晰可以看到这个脉络:main->do_cli->php_execute_scripts->zend_execute->execute_ex->ZEND_DO_FCALL_SPEC_RETVAL_USED_HANDLER->reflection_type_factory对于main,do_cli,php_execute_scripts,zend_execute,execute_ex 根据前面的main函数分析,我们很容易能够理解各个函数的作用。换句话说,execute_ex才是实际上调用 opcode最终最重要的函数。对照这个脚本的 opcode:L1-21{main}()/home/xiaoju/software/php7/demo/echo.php-0x7fd6a127f000+30opsL3#0NOPL11#1NOPL16#2NEW"ReflectionMethod"@1L16#3SEND_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承接活动协议
- 2024年度第四人民医院食堂餐饮服务合同3篇
- 二零二四年超声波传感器技术开发合同
- 二零二四年度数字档案馆建设与服务合同
- 2024年电子设备维修打胶合同
- 二零二四年滑雪场规划地形图保密合作协议3篇
- 二零二四年度安居工程项目施工合同
- 医疗机构药品合同
- 商场内餐饮企业的燃气安全协议书(2篇)
- 二零二四年度电商平台内容版权合作与授权合同3篇
- 高尿酸血症与痛风的诊治进展课件
- 《客舱安全与应急处置》-课件:应急撤离的原因和原则
- 《卖炭翁-白居易作业设计方案-2023-2024学年初中语文统编版》
- 红色文化之烈士陵园
- 新版人教版八年级上册英语单词表(默写)全册
- 海洋的前世今生智慧树知到期末考试答案2024年
- 大学生职业规划书铁道机车
- 5.2细胞的能量“货币”ATP第1课时课件-高一上学期生物人教版必修1
- 心脑血管疾病的课件
- 第六章 计划及其制订
- 高中物理 选修一《机械振动》大单元教学设计
评论
0/150
提交评论