文档章节

php代码的opcode

o
 osc_y8yehimr
发布于 2019/03/22 11:08
字数 463
阅读 19
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 

echo 1;        1
function test(){   2
    $a="abc";       3
    echo $a;        4   
}
test();             5

 

多个opcode组成一个op_array, 函数内的opcode与函数外的opcode属于不同的op_array

也就是说 第1行代码 和第2行代码 ,第5行代码  是属于同一个op_array

第3行代码 ,第4行代码 属于另一个op_array

 

//echo 1;
zend_op_array op_array = emalloc(sizeof(zend_op_array));
op_array->opcodes = emalloc(64*sizeof(zend_op)); //默认64个zend_op INITIAL_OP_ARRAY_SIZE 
CG(active_op_array) = op_array;
op_array->type = ZEND_EVAL_CODE;
zend_op *opline= CG(active_op_array)->opcodes+CG(active_op_array)->last++;
opline->opcode=ZEND_ECHO;
opline->op1=1;
opline->op1_type=IS_CONST;

 

 

//function test()
zend_op *opline= CG(active_op_array)->opcodes+op_array->last++;
zend_op opline = CG(active_op_array)->opcodes+CG(active_op_array)->last++;
opline->opcode=ZEND_DECLARE_FUNCTION;
opline->op1_type=CONST;
opline->op1=op_array->function_name;
opline->op2=null;

//保留之前的op_array
tmp = CG(active_op_array);

zend_op_array op_array = emalloc(sizeof(zend_op_array));
op_array->opcodes = emalloc(64*sizeof(zend_op)); //默认64个zend_op INITIAL_OP_ARRAY_SIZE 
op_array->type = ZEND_USER_FUNCTIOIN
op_array->function_name = strtolower(function_name)


CG(function_table)[hash(op_array->function_name)] = op_array;
CG(active_op_array) = op_array;


zend_op *opline= CG(active_op_array)->opcodes+CG(active_op_array)->last++;
opline->opcode=ZEND_ASSIGN;
opline->op1="a";
opline->op1_type=IS_CV;
opline->op2="abc"
opline->op2_type=IS_CONST;

 

pass_two(CG(active_op_array) TSRMLS_CC); //设置handler
CG(active_op_array) = function_token->u.op_array

 

 

//test();
zend_op *opline =CG(active_op_array)->opcodes+CG(active_op_array)->last_count++;
opline->opcode=ZEND_DO_FCALL;
opline->op1=function_name;
opline->op1_type=IS_CONST;

最后再执行pass_two(CG(active_op_array) TSRMLS_CC); 
设置下面三个的handler
echo 1;
function test()
test();

 

那么执行的时候,EG(active_op_array)=CG(active_op_array)

遍历其内部的opcodes,挨个执行

 

先执行 echo  1;

再执行 test(); 从EG(function_table)找到相应的op_array,再遍历其内部的opcode,再逐个执行

 

在执行ZEND_DECLARE_FUNCTION的时候,如果重复,会报错,编译期间不会报错

 

函数编译这块见 这里

java 的字节码 和php的opcode 完全不一样 见这里, php的opcode 还是C语言代码 ,而java的字节码是二进制的,只不过不能被OS执行执行,需要专门的虚拟机

 

echo 的 实现 这里 使用了fwrite(str,1,str_len,stderr);

stderr没有缓冲, stdout 有缓冲 (stdin也有),当遇到\n才输出

 http://www.php-internals.com/book/?p=chapt03/03-06-02-var-scope

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
PHP代码执行流程

怎么样?有点了解了么。说实话,单看这个,我本人是有点懵的,不过,不要怕。咱们来慢慢地看下。 首先,在网上找的信息说PHP代码执行的顺序是这样的,第一步是词法分析,第二步是语法分析,第...

osc_izu6drnv
2019/05/30
1
0
PHP相关知识2

二、PHP Zend Engine Zend Engine是开源的、PHP脚本语言的解释器,它最早是由以色列理工学院(Technion)的学生Andi Gutmans和Zeev Suraski所开发,Zend也正是此二人名字的合称。后来两人联合创...

yutianheji
2016/05/15
2
0
PHP7开启opcache打造强悍性能

鸟哥在博客中说,提高PHP 7性能的几个tips,第一条就是开启opcache: 记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没...

osc_6nds72mv
2018/05/04
12
0
PHP “==” 运算符深究

0x00问题背景 群友抛出一个题,空数组array()与0 比较大小的结果如何? 另一个群友也借机抛出了另一个问题 <?php var_dump(null == 0); var_dump(null == array()); vardump(0 == array());...

Frank_mc
2015/11/28
90
1
PHP-深入理解Opcode缓存

1.什么是opcode缓存?   当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译,减少CPU和内存...

tianhuahua
2019/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

eclipse汉化教程(附安装包)

eclipse汉化包安装步骤 一、去官网或者在本站下载Eclipse(不管是什么版,中文设置的方法都是差不多的,所以说我们汉化的教程不管未来更新多少个版本都是一样的) 官方下载地址:www.eclipse.o...

树懒宝宝
33分钟前
22
0
CocosCreator之分层管理的ListView

前言 进入公众号回复listview即可获得demo的git地址。 之前写的一篇文章《Creator之ScrollView那些事》中提到了官方Demo中提供的ListViewCtl,只是实现了纵向滑动,没有实现横向滑动。并且建议...

陈广文
37分钟前
24
0
在CSS Flexbox中,为什么没有“ justify-items”和“ justify-self”属性?

问题: Consider the main axis and cross axis of a flex container: 考虑伸缩容器的主轴和横轴: Source: W3C 资料来源: W3C To align flex items along the main axis there is one pro......

法国红酒甜
38分钟前
17
0
搜索解决方案 - ElasticSearch/Solr/Lucene

搜索解决方案 - ElasticSearch/Solr/Lucene 1. 什么是 ElasticSearch ElasticSearch 是一个基于 Lucene 的搜素服务器 是一个分布式、高扩展、实时的搜素与数据分析引擎 基于 RESTful web 接口...

夙梦o
42分钟前
26
0
设计模式学习笔记(五):工厂方法模式

1 前言 尽管简单工厂模式实现了对象的创建和使用分离,但是仍然存在以下两个问题: 工厂类过于庞大,包含了大量的判断代码,导致维护和测试难度增大 系统扩展不灵活,如果增加了新的产品类型...

氷泠
45分钟前
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部