考试报名信息,太谷教育信息网欢迎您!
当前位置:首页 > > 考试 > > 计算机类 > 内容页

php内核分析之zend

2021-04-22 14:45:05计算机类访问手机版72

  php内核分析之zend-compile

  学习PHP的时候也许你会用到关于PHP内核方面的知识,以下是小编精心为大家整理的php内核分析之zend_compile,希望对大家有所帮助!更多内容请关注应届毕业生网!

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

  回到之前看的zend_eval_stringl

  ZEND_API int zend_eval_stringlchar *str, size_t str_len, zval *retval_ptr, char *string_name /* */

  ...

  new_op_array = zend_compile_string&pv, string_name; // 这个是把php代码编译成为opcode的过程

  ...

  zend_executenew_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_stringzval *source_string, char *filename

  zend_lex_state original_lex_state;

  zend_op_array *op_array = NULL;

  zval tmp;

  // 如果传进来要解析的字符为空,则返回null

  if Z_STRLEN_Psource_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_scanningsource_string, filename == SUCCESS // 做编译前的准备

  BEGINST_IN_SCRIPTING; // 设置状态为正在编译

  op_array = zend_compileZEND_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_compi

TAG标签: 分析PHP