微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

cli(Command Line Interface)即PHP的命令行模式,现在此SAPI是认安装的,我们在服务器上安装完PHP之后,一般会生成一个可执行文件,假设此文件为/usr/local/bin/PHP,那么我们在SHELL下可以用以下命令来执行一个PHP脚本:

代码如下:
PHP -f test.PHP

以CLI SAPI为例来对PHP执行核心部分进行解析。CLI是PHP命令行模式,此SAPI是认安装的,在服务器端安装过PHP后,生成一个可执行文件,可以在shell中调用PHP命令来执行。

代码如下:
PHP -f XX.PHP

执行流程:

解析命令行参数;

初始化环境;

编译执行PHP代码

清理环境,退出

在第3个阶段中,如何执行PHP脚本的:

通过调用PHP_execute_script( handle_file )来完成第三阶段,该函数最终会调用zend_execute_scipts( … ) ,这个函数一个可变参函数,可以一次执行多个PHP脚本。

在zend_execut_scripts(…..)函数中核心调用了(zend_compile_file)( compile_file ),(*zend_execute)( zend_op_array )这两个函数

通过调用zend_compile_file编译参数指定的PHP脚本文件,该函数会返回一个zend_op_array的结构指针;

zend_execute传入的参数是zend_compile_file的返回值,就开始执行opcode了。

这两个函数是Zend API,是一个函数指针,在引擎初始化的时候回赋值具体的方法

ps.:那为什么这两个Zend API是函数指针呢?

在引擎初始化的时候,zend_execute和zend_compile_file会在引擎初始化的时候指向认的方法。我们可以在编译和执行重写函数的指向,这样就为我们扩展引擎时留下了钩子。例如:vld将zend_execute和zend_compile_file指向自己对原始函数封装后的函数添加了opcode信息的输出

原文地址:https://www.jb51.cc/php/20716.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐