这里将介绍引擎内部执行一个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解释器5.2.14 for win32"是指在Windows 32位系统上运行的PHP解释器,它是PHP代码的执行引擎。安装此解释器后,开发者可以在本地环境中运行PHP脚本,进行测试和调试。安装过程中,用户需要选择合适的配置选项,如...
在解释器的工作流程中,有以下几个主要步骤:解析命令行参数、初始化环境、编译执行PHP代码以及清理环境并退出程序。 首先,当我们通过命令行使用PHP时,CLI(命令行接口)会启动,这是PHP的一种SAPI(Server API)...
MySQL的执行流程是数据库操作的关键环节,它涉及多个步骤,从客户端请求到最终的数据检索和返回。以下是对这个流程的详细解释: 1. **客户端程序与Connectors**:客户端程序,如MySQL自带的命令行工具或PHP、Go、...
在tmd_tpl中,开发者可能会使用特定的语法(如`{$var}`来表示变量,`{% if %}`和`{% endif %}`用于条件判断,`{% for %}`和`{% endfor %}`进行循环操作)来编写模板,然后通过PHP解析和执行这些模板,生成最终的HTML...
在Apache的情况下,PHP通过mod_php5.so模块与服务器连接,使得PHP解释器可以在服务器启动时加载并运行。 PHP的核心由三个主要部分组成: 1. **PHP内核**:负责处理请求,包括文件流、错误处理和基本的输入/输出...
在本项目中,Nginx被配置为处理HTTP请求,并可能与PHP解释器进行通信,以便执行动态内容。 2. **PHP**:PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,尤其适合Web开发。它可以嵌入到HTML中,用于...
- **执行**:在实际请求时,PHP解释器读取编译好的代码,结合后台提供的数据,生成最终的HTML输出。 3. **NewsTengphp语法** NewsTengphp支持多种语法结构,如变量插值、条件语句、循环结构等。例如: - **变量...
Zend引擎是PHP的核心,它是PHP解释器的一部分,负责将PHP源代码转化为机器可执行的指令。深入学习Zend引擎,可以了解到如何编写更高效、更贴近底层的代码,比如理解ZVAL数据结构,它是PHP中表示变量的基石;了解Zend...
MVC模式是软件工程中的一种设计模式,旨在分离业务逻辑(模型)、用户界面(视图)和应用程序控制流程(控制器)。在PHP中,Smarty作为一款模板引擎,为开发人员提供了将逻辑代码与呈现样式相分离的能力,从而促进...
它通常与Apache或Nginx等Web服务器配合,通过解释器处理PHP代码并生成HTML内容。然而,PHP本身并不直接支持生成可执行的Windows程序。标题中的"PHP电子商务网站的exe程序"可能意味着开发者使用了一些第三方工具或...
1. **嵌入式PHP的工作原理**:理解如何在其他C/C++程序中调用PHP解释器,执行PHP脚本,以及获取脚本执行结果。 2. **PHP API**:学习使用PHP API在C程序中创建和操作PHP变量,调用PHP函数,以及处理PHP的错误和异常...
1. **src/**:源代码的核心部分,包括了PHP的解释器、扩展和各种核心函数。其中,`main/`目录包含PHP的主程序,` Zend/`目录则是PHP的虚拟机引擎,负责执行PHP代码。 2. **ext/**:PHP的扩展库,如mysqli用于MySQL...
1. **环境搭建**:首先,你需要在服务器上安装PHP解释器,这通常通过包管理器(如apt-get for Ubuntu, yum for CentOS)完成。 2. **配置文件**:PHP的主要配置文件是`php.ini`,在这里你可以设置各种选项,如错误...
而解释器则直接执行源代码,不生成中间代码。理解这种工作流程,有助于我们分析源码中的关键函数和模块。 文件名“易语言PHP代码翻译器源码”表明,这个项目可能包含了源码的所有组成部分,包括主程序、翻译引擎、...
“嵌入”则是将PHP解释器整合到其他应用中的过程,使得这些应用能够执行PHP脚本。这在需要动态内容生成的系统中非常有用,比如构建一个基于PHP的Web服务器模块,或者在命令行工具中使用PHP脚本。嵌入PHP可以让开发者...
为了运行此物资管理系统,首先需要一个PHP运行环境,通常推荐使用XAMPP或WAMP这样的集成开发环境,它们包含Apache服务器、PHP解释器以及MySQL数据库,提供了一站式解决方案,便于本地开发和测试。 3. **系统部署**...
bin文件通常包含PHP解释器和其他命令行工具。 3. **配置环境变量**:为了能在命令行中直接运行PHP命令,需要将PHP7的bin目录添加到系统的PATH环境变量中。 4. **测试安装**:完成上述步骤后,可以通过在命令行输入...
此外,VS2022还支持PHP版本管理,允许开发者选择不同版本的PHP解释器进行开发。 2. **代码编辑功能** 通过内置的代码编辑器,VS2022提供了智能感知功能,可预测并建议可能的函数、类和变量,从而提高编码速度。它...
5. **高性能**:PHP解释器能够高效地处理请求,且内存消耗相对较低。 6. **丰富的库支持**:PHP拥有大量现成的函数库,涵盖网络、日期时间、文件操作、加密等多个领域,大大简化了开发过程。 【PHP课程学习内容】 ...