php内核分析之zend-compile
学习PHP的时候也许你会用到关于PHP内核方面的知识,以下是百分网小编精心为大家整理的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); /pic/p>
...
zend_execute(new_op_array, &local_retval); /pic/p>
...
retval = SUCCESS;
return retval;
}
这里的zend_execute执行了两步,第一步是把php编译解析成为opcode的过程,我们就先看这个。
zend_compile_string
zend_compile_string函数追下去可以追到compile_string
/pic/p>
zend_op_array *compile_string(zval *source_string, char *filename)
{
zend_lex_state original_lex_state;
zend_op_array *op_array = NULL;
zval tmp;
/pic/p>
if (Z_STRLEN_P(source_string)==0) {
return NULL;
}
ZVAL_DUP(&tmp, source_string); /pic/p>
convert_to_string(&tmp); /pic/p>
source_string = &tmp;
zend_save_lexical_state(&original_lex_state); /pic/p>
if (zend_prepare_string_for_scanning(source_string, filename) == SUCCESS) { /pic/p>
BEGIN(ST_IN_SCRIPTING); /pic/p>
op_array = zend_compile(ZEND_EVAL_CODE); /pic/p>
}
zend_restore_lexical_state(&original_lex_state); /pic/p>
zval_dtor(&tmp); /pic/p>
return op_array;
}
里面最核心的就是zend_compile了。这里的几个点可以看看:
1 这么做类型转换,参考convert_to_string。这个函数就是把任意类型的值转换为zval的string类型。
2 zval_dtor,这个函数是能把任意的zval变量做回收。非常好用。
3 ZVAL_DUP,是进行复制,它和ZVAL_COPY的区别在于是否增加gc的引用计数。
下面又找到关键点:zend_compi
【php内核分析之zend-compile】相关文章:
php内核分析之扩展01-31
php内核分析之zval11-19
php内核分析之opcode02-15
php内核分析之do-cli01-09
php内核分析之全局变量12-14
php内核分析之sapi-module-struct10-04
php内核分析之ZTS和zend-try08-24
php学习之php配置03-11
php学习之php预定义变量11-02