zoukankan      html  css  js  c++  java
  • php内核分析(八)-zend_compile

    这里阅读的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_array
    zend_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

  • 相关阅读:
    python自动化测试(2)--读取excel中的测试用例并使用列表进行存放
    Numpy学习记录
    Tensorflow环境安装记录--无法识别GPU的问题
    Tensorflow框架学习(1)--CNN的实现
    IDEA创建springboot项目总是创建失败问题的解决
    java_集合知识点小结
    java易错知识点汇总_1
    struts2 中文件的位置问题
    struts2 action中的私有变量
    span 标记 width 设置
  • 原文地址:https://www.cnblogs.com/yjf512/p/6132985.html
Copyright © 2011-2022 走看看