`

PHP解释器引擎执行流程

 
阅读更多

    这里将介绍引擎内部执行一个PHP脚本的流程,以cli SAPI为例子来对流程中核心的部分做简单介绍,省去一些初始化及清理操作。
    CLI(Command Line Interface)即PHP的命令行模式,现在此SAPI是默认安装的,我们在服务器上安装完PHP之后,一般会生成一个可执行文件,假设此文件为/usr/local/bin/php ,那么我们在SHELL下可以用以下命令来执行一个PHP脚本:
/usr/local/bin/php -f test.php
这个命令将执行当前目录下的test.php脚本,我们暂且不关心test.php具体内容,只关心一下这个执行的内部过程是怎么样的。


      CLI的主源代码文件在{PHPSRC}/sapi/cli/php_cli.c,整个过程就从这个文件中的 main()函数执行,整个函数比较长,主要可以分为以下几个阶段:
1:解析命令行参数
2:初始化环境
3:编译执行PHP代码
4:清理环境并返回退出


在第1个阶段中,解析-f参数为执行一个PHP文件,-f后面的test.php就是需要被执行的文件
这里我们将关注第3个阶段,如何执行test.php中的PHP代码。
最终是通过php_execute_script(&file_handle TSRMLS_CC)来执行PHP的脚本,这个函数定义在{PHPSRC}/main/main.c,原型为:
PHPAPI int php_execute_script(zend_file_handle *primary_file TSRMLS_DC) 
file_handle的类型为zend_file_handle,这个是zend对文件句柄的一个封装,里面的内容就是和test.php相关的了。

php_execute_script最终是调用的zend_execute_scripts,这个函数定义在{PHPSRC}/Zend/zend.c,原型为:
ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...) 
此函数具有可变参数,可以一次执行多个PHP文件,在此函数中最核心的是调用zend_compile_file和zend_execute,

zend_compile_file是一个函数指针,其声明在{PHPSRC}/Zend/zend_compile.c:
ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);  在引擎初始化的时候,会将compile_file函数的地址赋值给zend_compile_file,compile_file函数定义在{PHPSRC}/Zend/zend_language_scanner.c,通过声明可以看到这个函数以zend_file_handle指针作为参数,返回一个指向zend_op_array的指针。


zend_execute也是一个函数指针,其声明在{PHPSRC}/Zend/zend_execute.c:
ZEND_API extern void (*zend_execute)(zend_op_array *op_array TSRMLS_DC); 
同样在引擎初始化的时候,会将execute函数的地址赋值给zend_execute,execute的定义在{PHPSRC}/Zend/zend_vm_execute.h。
通过声明知道zend_execute以一个指向zend_op_array结构的指针作为参数,这个指针即前面zend_compile_file的返回值,zend_execute就开始执行op_array中的op code,在执行op code的过程中,就实现了PHP语言的各种功能。

 

到这里主要的执行工作基本就完成。

PS:

    为什么要把zend_execute和zend_compile_file定义为函数指针?

    在引擎初始化(zend_startup)的时候,将zend_execute指向了默认的execute,zend_compile_file指向了默认的compile_file。我们可以在实际编译和执行之前将zend_execute和zend_compile_file重写为其他的编译和执行函数,这样就为我们扩展引擎留下了钩子,比如一个比较有名的查看PHP的op code的扩展vld(http://www.derickrethans.nl/projects.html#vld),此扩展就是在每次请求初始化的钩子函数(PHP_RINIT_FUNCTION)中,将zend_execute和zend_compile_file替换成自己的vld_execute和vld_compile_file,这两个函数其实是对原始函数进行了封装,添加了输出opcode信息的附加功能,因为引擎初始化是发生在模块请求初始化之前,而模块请求初始化又是在编译和执行之前,所以这样的覆盖能达到目的。

 

 

原文地址: http://blog.csdn.net/phpkernel/article/details/5716342

分享到:
评论

相关推荐

    php教程和php解释器5.2.14

    "PHP解释器5.2.14 for win32"是指在Windows 32位系统上运行的PHP解释器,它是PHP代码的执行引擎。安装此解释器后,开发者可以在本地环境中运行PHP脚本,进行测试和调试。安装过程中,用户需要选择合适的配置选项,如...

    PHP内核探索之解释器的执行过程

    在解释器的工作流程中,有以下几个主要步骤:解析命令行参数、初始化环境、编译执行PHP代码以及清理环境并退出程序。 首先,当我们通过命令行使用PHP时,CLI(命令行接口)会启动,这是PHP的一种SAPI(Server API)...

    Mysql 执行流程.doc

    MySQL的执行流程是数据库操作的关键环节,它涉及多个步骤,从客户端请求到最终的数据检索和返回。以下是对这个流程的详细解释: 1. **客户端程序与Connectors**:客户端程序,如MySQL自带的命令行工具或PHP、Go、...

    基于PHP的tmd_tpl国产PHP模板引擎 v1.0.zip

    在tmd_tpl中,开发者可能会使用特定的语法(如`{$var}`来表示变量,`{% if %}`和`{% endif %}`用于条件判断,`{% for %}`和`{% endfor %}`进行循环操作)来编写模板,然后通过PHP解析和执行这些模板,生成最终的HTML...

    php底层工作原理

    在Apache的情况下,PHP通过mod_php5.so模块与服务器连接,使得PHP解释器可以在服务器启动时加载并运行。 PHP的核心由三个主要部分组成: 1. **PHP内核**:负责处理请求,包括文件流、错误处理和基本的输入/输出...

    Nginx+php+mysql+phpmyadmin引擎管理器C++源码.rar

    在本项目中,Nginx被配置为处理HTTP请求,并可能与PHP解释器进行通信,以便执行动态内容。 2. **PHP**:PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,尤其适合Web开发。它可以嵌入到HTML中,用于...

    基于PHP的NewsTengphp模板引擎源码.zip

    - **执行**:在实际请求时,PHP解释器读取编译好的代码,结合后台提供的数据,生成最终的HTML输出。 3. **NewsTengphp语法** NewsTengphp支持多种语法结构,如变量插值、条件语句、循环结构等。例如: - **变量...

    php内核开发大全

    Zend引擎是PHP的核心,它是PHP解释器的一部分,负责将PHP源代码转化为机器可执行的指令。深入学习Zend引擎,可以了解到如何编写更高效、更贴近底层的代码,比如理解ZVAL数据结构,它是PHP中表示变量的基石;了解Zend...

    用模板引擎Smarty来开发PHP程序.pdf

    MVC模式是软件工程中的一种设计模式,旨在分离业务逻辑(模型)、用户界面(视图)和应用程序控制流程(控制器)。在PHP中,Smarty作为一款模板引擎,为开发人员提供了将逻辑代码与呈现样式相分离的能力,从而促进...

    PHP电子商务网站的exe程序,仅包含可执行文件

    它通常与Apache或Nginx等Web服务器配合,通过解释器处理PHP代码并生成HTML内容。然而,PHP本身并不直接支持生成可执行的Windows程序。标题中的"PHP电子商务网站的exe程序"可能意味着开发者使用了一些第三方工具或...

    Sams Extending and Embedding PHP

    1. **嵌入式PHP的工作原理**:理解如何在其他C/C++程序中调用PHP解释器,执行PHP脚本,以及获取脚本执行结果。 2. **PHP API**:学习使用PHP API在C程序中创建和操作PHP变量,调用PHP函数,以及处理PHP的错误和异常...

    php-7.3.29.tar.gz

    1. **src/**:源代码的核心部分,包括了PHP的解释器、扩展和各种核心函数。其中,`main/`目录包含PHP的主程序,` Zend/`目录则是PHP的虚拟机引擎,负责执行PHP代码。 2. **ext/**:PHP的扩展库,如mysqli用于MySQL...

    php-master_php源码_

    1. **环境搭建**:首先,你需要在服务器上安装PHP解释器,这通常通过包管理器(如apt-get for Ubuntu, yum for CentOS)完成。 2. **配置文件**:PHP的主要配置文件是`php.ini`,在这里你可以设置各种选项,如错误...

    易语言源码易语言PHP代码翻译器源码.rar

    而解释器则直接执行源代码,不生成中间代码。理解这种工作流程,有助于我们分析源码中的关键函数和模块。 文件名“易语言PHP代码翻译器源码”表明,这个项目可能包含了源码的所有组成部分,包括主程序、翻译引擎、...

    Extending.and.Embedding.PHP

    “嵌入”则是将PHP解释器整合到其他应用中的过程,使得这些应用能够执行PHP脚本。这在需要动态内容生成的系统中非常有用,比如构建一个基于PHP的Web服务器模块,或者在命令行工具中使用PHP脚本。嵌入PHP可以让开发者...

    一个基于Smarty模板引擎的php组织物资管理系统(毕业设计)

    为了运行此物资管理系统,首先需要一个PHP运行环境,通常推荐使用XAMPP或WAMP这样的集成开发环境,它们包含Apache服务器、PHP解释器以及MySQL数据库,提供了一站式解决方案,便于本地开发和测试。 3. **系统部署**...

    适用于pm的php7 bin文件

    bin文件通常包含PHP解释器和其他命令行工具。 3. **配置环境变量**:为了能在命令行中直接运行PHP命令,需要将PHP7的bin目录添加到系统的PATH环境变量中。 4. **测试安装**:完成上述步骤后,可以通过在命令行输入...

    Visual Studio 2022支持Php开发插件

    此外,VS2022还支持PHP版本管理,允许开发者选择不同版本的PHP解释器进行开发。 2. **代码编辑功能** 通过内置的代码编辑器,VS2022提供了智能感知功能,可预测并建议可能的函数、类和变量,从而提高编码速度。它...

    PHP课件 PHP资料

    5. **高性能**:PHP解释器能够高效地处理请求,且内存消耗相对较低。 6. **丰富的库支持**:PHP拥有大量现成的函数库,涵盖网络、日期时间、文件操作、加密等多个领域,大大简化了开发过程。 【PHP课程学习内容】 ...

Global site tag (gtag.js) - Google Analytics