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


本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/p/6132985.html,如需转载请自行联系原作者

相关文章
|
27天前
|
缓存 自然语言处理 PHP
深入PHP内核:理解OPcode和执行生命周期
在PHP的执行过程中,源代码经过词法分析、语法分析等一系列复杂的步骤后,最终会编译成一种叫做“操作码”(OPcode)的中间代码。本文将深入探讨PHP的操作码(OPcode)是什么,它是如何生成的,以及它在整个PHP脚本执行周期中扮演的角色。我们还将了解不同的OPcode优化技术,以及它们如何影响PHP应用程序的性能。通过本文,读者将对PHP的内部工作原理有更深刻的理解,为进一步的性能调优打下坚实的基础。
|
1月前
|
数据采集 前端开发 PHP
深入PHP内核:探索高性能异步编程
【2月更文挑战第24天】在现代Web开发中,提供快速响应和高并发处理能力是至关重要的。传统的同步阻塞模型已无法满足现代互联网服务的需求。本文将深入探讨PHP语言中的异步编程概念,介绍其原理、实现方式以及如何通过异步编程提升应用性能。我们将剖析PHP的多线程扩展,如pthreads,以及事件驱动编程模型,重点关注它们在处理大量并发连接时的优势和潜在问题。此外,文中还将展示如何使用Swoole等高级框架来构建高效的异步应用。最后,我们将讨论异步编程在实际应用中的挑战与未来发展趋势。
14 1
|
1月前
|
数据采集 存储 JavaScript
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
本文旨在介绍如何利用PHP中的simple_html_dom库结合爬虫代理IP技术来高效采集和分析汽车之家网站的电动车参数。通过实际示例和详细说明,读者将了解如何实现数据分析和爬虫技术的结合应用,从而更好地理解和应用相关技术。
PHP爬虫技术:利用simple_html_dom库分析汽车之家电动车参数
|
9月前
|
PHP
php开发实战分析(4):php调用封装函数包含文件路径自适应不同目录的解决方案($_SERVER[‘DOCUMENT_ROOT‘]与__DIR__魔术常量)
php开发实战分析(4):php调用封装函数包含文件路径自适应不同目录的解决方案($_SERVER[‘DOCUMENT_ROOT‘]与__DIR__魔术常量)
128 0
|
9月前
|
前端开发 JavaScript PHP
php开发实战分析(10):城市区县联动筛选
php开发实战分析(10):城市区县联动筛选
87 1
|
9月前
|
存储 监控 算法
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
php开发实战分析(9):使用实现短地址的分享的解决方案(第三方短链接服务、数据库自增ID转换、自定义短地址生成算法、自增数字短码)
184 0
|
9月前
|
SQL 缓存 关系型数据库
php开发实战分析(7):mysql类库操作的高级使用
php开发实战分析(7):mysql类库操作的高级使用
127 0
|
9月前
|
存储 缓存 JSON
php开发实战分析(6):配置文件或缓存文件的生成与调用
php开发实战分析(6):配置文件或缓存文件的生成与调用
103 0
|
9月前
|
存储 缓存 安全
php开发实战分析(5):文件和目录的操作
php开发实战分析(5):文件和目录的操作
105 0
|
9月前
|
SQL 安全 关系型数据库
php开发实战分析(8):mysql类库的操作高级使用API开发(字段操作、权限分配、日期格式、跨表查询,数据分表)
php开发实战分析(8):mysql类库的操作高级使用API开发(字段操作、权限分配、日期格式、跨表查询,数据分表)
299 0