位置: 编程技术 - 正文

PHP内核学习教程之php opcode内核实现(php内核剖析)

编辑:rootadmin

推荐整理分享PHP内核学习教程之php opcode内核实现(php内核剖析),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php8底层内核,php7内核,php内核剖析,php内涵,php7内核剖析,php内核剖析,php7内核剖析,php7内核剖析,内容如对您有帮助,希望把文章链接给更多的朋友!

opcode是计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令规范指定。 除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数。 这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。

通常opcode还有另一种称谓:字节码(byte codes)。 例如Java虚拟机(JVM),.NET的通用中间语言(CIL: Common Intermeditate Language)等等。

1. Opcode简介

opcode是计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令规范指定。 除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数。 这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等

通常opcode还有另一种称谓: 字节码(byte codes)。 例如Java虚拟机(JVM),.NET的通用中间语言(CIL: Common Intermeditate Language)等等

PHP中的opcode则属于前面介绍中的后着,PHP是构建在Zend虚拟机(Zend VM)之上的。PHP的opcode就是Zend虚拟机中的指令(基于Zend的中间代码)

Relevant Link:

2. PHP中的Opcode

0x1: 数据结构

在PHP实现内部,opcode由如下的结构体表示

php-5.6.Zendzend_compile.h

和CPU的指令类似,有一个标示指令的opcode字段,以及这个opcode所操作的操作数,PHP不像汇编那么底层, 在脚本实际执行的时候可能还需要其他更多的信息,extended_value字段就保存了这类信息, 其中的result域则是保存该指令执行完成后的结果

例如如下代码是在编译器遇到print语句的时候进行编译的函数

php-5.6.Zendzend_compile.c

0x2: opcode类型: zend_op->zend_uchar opcode

比对汇编语言的概念,每个opcode都对应于一个类型,表明该opcpde的"操作指令",opcode的类型为zend_uchar,zend_uchar实际上就是unsigned char,此字段保存的整形值即为op的编号,用来区分不同的op类型,opcode的可取值都被定义成了宏

/Zend/zend_vm_opcodes.h

PHP内核学习教程之php opcode内核实现(php内核剖析)

0x3: opcode执行句柄: zend_op->handler

op的执行句柄,其类型为opcode_handler_t

typedef int (ZEND_FASTCALL *opcode_handler_t) (ZEND_OPCODE_HANDLER_ARGS); 这个函数指针为op定义了执行方式,每一种opcode字段都对应一个种类的handler,比如如果$a = 1;这样的代码生成的op,操作数为const和cv,最后就能确定handler为函数ZEND_ASSIGN_SPEC_CV_CONST_HANDLER

/Zend/zend_vm_execute.h

0x4: opcpde操作数znode

操作数字段是_zend_op类型中比较重要的部分了,其中op1,op2,result三个操作数定义为znode类型

php-5.6.Zendzend_compile.h

0x5: opcode编译后数组op_array

在zend_do_print函数中的第一行,我们注意到下面这行代码

PHP脚本代码被编译后产生的opcode保存在op_array中,其内部存储的结构如下

php-5.6.Zendzend_compile.h

整个PHP脚本代码被编译后的opcodes保存在这里,在执行的时候由下面的execute函数执行

每条opcode都有一个opcode_handler_t的函数指针字段,用于执行该opcode,PHP有三种方式来进行opcode的处理

1. CALL: PHP默认使用CALL的方式,也就是函数调用的方式2. SWITCH: 由于opcode执行是每个PHP程序频繁需要进行的操作,可以使用SWITCH或者GOTO的方式来分发3. GOTO: 通常GOTO的效率相对会高一些,不过效率是否提高依赖于不同的CPU 实际上我们会发现,在/zend/zend_language_parser.c中就是Zend的opcode翻译解释执行过程,其中包含了call、switch、goto三种opcode执行方式

这就是PHP为什么称之为解释型语言的内核原理,PHP在完成Lex词法解析后,在语法解析即生成产生式的时候,直接通过call、switch、goto的方式调用zend api进行即使解释执行

Relevant Link:

3. opcode翻译执行(即时解释执行)

Relevant Link:

以上所述本文给大家介绍的PHP内核学习教程之php opcode内核实现的相关知识,希望对大家有所帮助。

PHP文件上传之多文件上传的实现思路 多文件上传的两种情况①使用多个name值inputtype="file"name="file1"inputtype="file"name="file2"inputtype="file"name="file3"inputtype="file"name="file4"a.点击提交之后接收到的数

PHP Curl模拟登录微信公众平台、新浪微博实例代码 使用curl之前先打开curl配置,具体方式百度一下就知道,开启curl扩展。密码用md5加密,这是经过测试成功的,把用户跟密码改成你的就行了。下面一段

实例详解PHP中html word 互转的方法 下面一段代码给大家介绍php将html转入word中,具体内容如下所示:这是经过测试的,这种方法有一点不好,html页面代码要写在php中,不过好歹能运行,

标签: php内核剖析

本文链接地址:https://www.jiuchutong.com/biancheng/288213.html 转载请保留说明!

上一篇:php实现爬取和分析知乎用户数据(php抓取)

下一篇:PHP文件上传之多文件上传的实现思路(php如何上传1个g以上的文件)

  • 以设备投资入股要交增值税
  • 小规模纳税人申请电子发票流程
  • 政府补贴营业外收入所得税汇算清缴需要调增吗
  • 净现值率和现值指数之间的关系
  • 计提坏账准备怎么理解
  • 企业自建房产可以抵押吗
  • 交通违章罚款可以在手机上交吗
  • 最新出口退税申报流程
  • 境外工资薪金
  • 企业可根据实际情况随意设置会计科目
  • 实收资本弥补亏损账务处理
  • 固定资产抵扣税金算增值税吗怎么算
  • 个人所得税必须得交吗
  • 核定征收是不是不需要发票了
  • 房屋抵债如何确定契税计税依据?
  • 小企业会计准则会计科目表
  • 银行代扣社保怎么做会计分录
  • 逾期申报会对纳税人产生哪些不良影响?
  • 分期付款购买商品房后续没钱还怎么办
  • 或有负债披露原则
  • 企业购房时支付的房租
  • 无形资产摊销算头不算尾
  • 电脑开机自动进入bios怎么解决
  • 会计中的低值易耗品
  • 开具红字发票信息表对方未接受到怎么办
  • 弥补亏损企业类型都是一般企业吗
  • linux设置权限规则
  • PadExe.exe - PadExe是什么进程 有什么用
  • u盘格式化技巧
  • uni app怎么样
  • 结转销售原材料会计分录
  • 深度学习实战——不同方式的模型部署(CNN、Yolo)
  • vue自定义日历组件
  • php pdo连接sqlserver
  • torch.nn.function
  • 股份有限公司都是私企吗
  • 交易性金融资产属于流动资产
  • php如何入门
  • 退货业务增值税税务处理
  • 固定资产类别有哪些
  • 农业企业所得税是免税的吗
  • 购买房屋用于出租属于投资行为吗
  • 进项税额申报表怎么填写
  • 函数的单调性
  • linux中mongodb启动
  • BootStrap--selectpicker的使用
  • 海关进口增值税专用缴款书稽核比对可能出现哪些结果
  • 收到报销单如何处理
  • 年均复合增长率该怎么算?
  • 空调维修费入办公费还是修理费
  • 一般纳税人不得领用专票的情形
  • 小规模纳税人转一般纳税人的条件
  • 应付票据转应付账款有附件吗
  • 其他应收款在借方怎么调账
  • 把上级机关来文转给下级机关的通知
  • 在建工程什么时候用
  • 未达到起征点的增值税怎么填写
  • 待清算商户款项分录的摘要是什么
  • 叉车累计折旧如何结转
  • 用友为什么引入不了账套
  • 财务人员的职工福利费应计入?
  • sql语句 字符串
  • mysql事务用法
  • xp系统无法更换桌面壁纸
  • mac如何开启屏幕录制权限
  • win10装360安全卫士
  • windows7如何启动任务管理器
  • win7 64位旗舰版电脑被唤醒之后显示器依然黑屏怎么办?
  • 批处理bat
  • 商务英语考英语笔译 算跨考吗
  • jquery动态设置css
  • 如何下载个人所得税A表
  • 委托代征管理办法最长有效期
  • 浙江增值税电子普通发票用支付宝怎么开
  • 浙江国税咨询电话12306
  • 清税申报表怎么填写
  • 荷兰基本工资一个月多少工资
  • 长春税务局待遇如何
  • 车辆购置税查询怎么查
  • 什么是印花税,印花税有哪些特点
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设