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


Posted in PHP onDecember 22, 2015

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

/usr/local/bin/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信息的输出。

PHP 相关文章推荐
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
Nov 12 PHP
PHP中数据类型转换的三种方式
Apr 02 PHP
PHP可变变量学习小结
Nov 29 PHP
php实现xml与json之间的相互转换功能实例
Jul 07 PHP
php代码检查代理ip的有效性
Aug 19 PHP
Windows下php+mysql5.7配置教程
May 16 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
php实现微信原生支付(扫码支付)功能
May 30 PHP
PHP实现时间日期友好显示实现代码
Sep 08 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
Nov 25 PHP
PHP使用PDO 连接与连接管理操作实例分析
Apr 21 PHP
PHP内核探索之变量
Dec 22 #PHP
yii2.0使用Plupload实现带缩放功能的多图上传
Dec 22 #PHP
PHP输入流php://input实例讲解
Dec 22 #PHP
服务器迁移php版本不同可能诱发的问题
Dec 22 #PHP
php上传图片并压缩的实现方法
Dec 22 #PHP
PHP实现图片上传并压缩
Dec 22 #PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
Dec 21 #PHP
You might like
PHP 5.0 Pear安装方法
2006/12/06 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
php抽象类用法实例分析
2015/07/07 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
Auntion-TableSort国人写的一个javascript表格排序的东西
2007/11/12 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
JS常用函数使用指南
2014/11/23 Javascript
javascript封装 Cookie 应用接口
2015/08/07 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
Vue2.5学习笔记之如何在项目中使用和配置Vue
2018/09/26 Javascript
原生JS实现手动轮播图效果实例代码
2018/11/22 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
[01:01:04]2018DOTA2亚洲邀请赛 4.5 淘汰赛 OpTic vs TNC 第一场
2018/04/06 DOTA
python复制文件代码实现
2013/12/23 Python
Python获取系统默认字符编码的方法
2015/06/04 Python
python re模块findall()函数实例解析
2018/01/19 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
详解python播放音频的三种方法
2019/09/23 Python
python exit出错原因整理
2020/08/31 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
日本最大化妆品和美容产品的综合口碑网站:cosme shopping
2019/08/28 全球购物
Orlebar Brown官网:设计师泳裤和泳装
2020/12/08 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
一套SQL笔试题
2016/08/14 面试题
医学检验专业个人求职信范文
2013/12/04 职场文书
水电施工员岗位职责
2015/04/11 职场文书
总结Python变量的相关知识
2021/06/28 Python
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js