php 中间代码opcode

php的词法分析、语法分析大多采用Flex/Bison处理

在语法分析完成后,由zend引擎生成中间代码(使用opcache可以省略编译阶段)opcode,PHP是构建在Zend虚拟机(Zend VM)之上的。PHP的opcode就是Zend虚拟机中的指令

在PHP实现内部,opcode由如下的结构体表示:
struct _zend_op {
opcode_handler_t handler; // 执行该opcode时调用的处理函数
znode result;
znode op1;
znode op2;
ulong extended_value;
uint lineno;
zend_uchar opcode; // opcode代码
};

由上可知所谓的opcode就是zend虚构的有c结构体标识的一种指令集(大概有130多个)

例如如下代码是在编译器遇到print语句的时候进行编译的函数:
void zend_do_print(znode *result,const znode *arg TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->result.op_type = IS_TMP_VAR;
opline->result.u.var = get_temporary_variable(CG(active_op_array));
opline->opcode = ZEND_PRINT;
opline->op1 = *arg;
SET_UNUSED(opline->op2);
*result = opline->result;
}
这个函数新创建一条zend_op,将返回值的类型设置为临时变量(IS_TMP_VAR),并为临时变量申请
空间, 随后指定opcode为ZEND_PRINT,并将传递进来的参数赋值给这条opcode的第一个操作数。这样
在最终执行这条opcode的时候, Zend引擎能获取到足够的信息以便输出内容。(实质就是zend解析print语句时会通过zend_do_print函数去生成这个中间代码opcode)

opcode被保存在op_array结构体中,再由execute函数顺序执行opcode代码。

时间: 2024-11-13 12:53:50

php 中间代码opcode的相关文章

i春秋——“百度杯”CTF比赛 十月场——Vld(Vulcan Logic Dumper 、php opcode、sql 报错注入)

打开题目看到提示 "do you know Vulcan Logic Dumper?" ,再查看源码看到"<!-- index.php.txt ?>",访问后发现一堆看不懂的东西 这肯定就是所谓的Vulcan Logic Dumper了,先了解下相关概念 PHP内核-Zend引擎:http://www.php.cn/php-weizijiaocheng-355597.html PHP中的opcode:https://blog.csdn.net/weiyu

PHP内核探索:zend_execute的具体执行过程

PHP内核探索:zend_execute的具体执行过程 解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h: ZEND_API void execute(zend_op_array *op_array TSRMLS_DC)   {       zend_execute_data *execut

《PHP内核探索系列文章》系列技术文章整理收藏

<PHP内核探索系列文章>系列技术文章整理收藏 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识的文章,对PHP高级进阶的朋友提供PHP内核方面的知识点探讨 1PHP内核探索:从SAPI接口开始 2PHP内核探索:一次请求的开始与结束 3PHP内核探索:再次探讨SAPI 4PHP内核探索:Apache模块介绍 5PHP内核探索:Zend引擎 6PHP内核探索:多进程/线程的SAPI生命周期 7PHP内核探索:单进程SAPI生命周期 8PHP内核探索:一次请求生命周期 9PHP内核探索:

PHP内核探索:变量存储与类型

先回答前面一节的那个问题吧. 01 <?php 02 $foo = 10; 03 $bar = 20; 04    05 function change() { 06     global $foo; 07     //echo '函数内部$foo = '.$foo.'<br />'; 08     //如果不把$bar定义为global变量,函数体内是不能访问$bar的 09     $bar = 0; 10     $foo++; 11 } 12    13 change(); 14

【原创】Nginx+PHP-FPM优化技巧总结(转)

php-fpm的安装很简单,参见PHP(PHP-FPM)手动编译安装.下面主要讨论下如何提高Nginx+Php-fpm的性能. 1.Unix域Socket通信 之前简单介绍过Unix Domain Socket这种通信方式,参见:Nginx+PHP-FPM的域Socket配置方法 Unix域Socket因为不走网络,的确可以提高Nginx和php-fpm通信的性能,但在高并发时会不稳定. Nginx会频繁报错: connect() to unix:/dev/shm/php-fcgi.sock f

____PHP内核探索:命名空间

PHP内核探索:命名空间 命名空间是一种特殊的作用域 感谢 参考或原文 www.php-internal.com 服务器君一共花费了81.974 ms进行了3次数据库查询,努力地为您提供了这个页面. 试试阅读模式?希望听取您的建议 在维基百科中,对命名空间的定义是: 命名空间(英语:Namespace)表示标识符(identifier)的上下文(context).一个标识符可在多个命名空间中定义, 它在不同命名空间中的含义是互不相干的.在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用

PHP内核解密系列:zend_execute的执行过程

PHP内核解密系列:zend_execute的执行过程 解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h: ZEND_API void execute(zend_op_array *op_array TSRMLS_DC) { zend_execute_data *execute_data;

OPCache使用示例

OPcache 有什么用? OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销. OPcache如何开启? 参考手册:http://php.net/manual/zh/opcache.installation.php OPcache相关设置?(本文主要针对windows上的配置) 关于配置的说明和更多的配置项参考:http://php.net/manual/zh/opcache.conf

【转载】php-fpm的高CPU使用率排查方法

1.CPU使用率监控 sar -P ALL 1 100 输出结果如下:CPU %user %nice %system %iowait %steal %idleall 85.54 0.00 5.69 0.00 0.00 8.76 0 74.75 0.00 25.25 0.00 0.00 0.00 1 98.00 0.00 2.00 0.00 0.00 0.00 2 89.22 0.00 3.92 0.00 0.00 6.86 3 91.00 0.00 2.00 0.00 0.00 7.00 4 7