博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php内核分析(八)-zend_compile
阅读量:6291 次
发布时间:2019-06-22

本文共 1536 字,大约阅读时间需要 5 分钟。

这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux

回到之前看的zend_eval_stringl

ZEND_API int zend_eval_stringl(char *str, size_t str_len, zval *retval_ptr, char *string_name) /* {
{
{ */{ ... new_op_array = zend_compile_string(&pv, string_name); // 这个是把php代码编译成为opcode的过程 ... zend_execute(new_op_array, &local_retval); // 这个是具体的执行过程,执行opcode,把结果存储到local_retval中 ... retval = SUCCESS; return retval;}

这里的zend_execute执行了两步,第一步是把php编译解析成为opcode的过程,我们就先看这个。

zend_compile_string

zend_compile_string函数追下去可以追到compile_string

// 将一个字符串解析成为op_arrayzend_op_array *compile_string(zval *source_string, char *filename){     zend_lex_state original_lex_state;     zend_op_array *op_array = NULL;     zval tmp;    // 如果传进来要解析的字符为空,则返回null     if (Z_STRLEN_P(source_string)==0) {          return NULL;     }     ZVAL_DUP(&tmp, source_string); // 复制source_string到zval中     convert_to_string(&tmp); // 如果不是字符类型就转换为字符类型     source_string = &tmp;     zend_save_lexical_state(&original_lex_state); // 保存lex上下文     if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) {  // 做编译前的准备          BEGIN(ST_IN_SCRIPTING); // 设置状态为正在编译          op_array = zend_compile(ZEND_EVAL_CODE); // 进行编译,并把生成结果放在op_array中     }     zend_restore_lexical_state(&original_lex_state); // 恢复lex上下文     zval_dtor(&tmp); // 释放tmp     return op_array;}

里面最核心的就是zend_compile了。这里的几个点可以看看:

1 这么做类型转换,参考convert_to_string。这个函数就是把任意类型的值转换为zval的string类型。

2 zval_dtor,这个函数是能把任意的zval变量做回收。非常好用。
3 ZVAL_DUP,是进行复制,它和ZVAL_COPY的区别在于是否增加gc的引用计数。

下面又找到关键点:zend_compile

转载地址:http://lccta.baihongyu.com/

你可能感兴趣的文章
@RequestMapping 用法详解之地址映射
查看>>
254页PPT!这是一份写给NLP研究者的编程指南
查看>>
《Data Warehouse in Action》
查看>>
String 源码浅析(一)
查看>>
Spring Boot 最佳实践(三)模板引擎FreeMarker集成
查看>>
Fescar 发布 0.2.3 版本,支持 Redis 和 Apollo
查看>>
Google MapReduce到底解决什么问题?
查看>>
CCNP-6 OSPF试验2(BSCI)
查看>>
Excel 2013 全新的图表体验
查看>>
openstack 制作大于2TB根分区自动扩容的CENTOS镜像
查看>>
Unbuntu安装遭遇 vmware上的Easy install模式
查看>>
几个常用的ASP木马
查看>>
python分析postfix邮件日志的状态
查看>>
Mysql-5.6.x多实例配置
查看>>
psutil
查看>>
在git@osc上托管自己的代码
查看>>
机器学习算法:朴素贝叶斯
查看>>
小五思科技术学习笔记之扩展访问列表
查看>>
使用Python脚本检验文件系统数据完整性
查看>>
使用MDT部署Windows Server 2003 R2
查看>>