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 相关文章推荐
用 PHP5 轻松解析 XML
Dec 04 PHP
zf框架的registry(注册表)使用示例
Mar 13 PHP
PHP 微信支付类 demo
Nov 30 PHP
PHP记录页面停留时间的方法
Mar 30 PHP
ThinkPHP中limit()使用方法详解
Apr 19 PHP
PHP手机号中间四位用星号*代替显示的实例
Jun 02 PHP
PHP查询分页的实现代码
Jun 09 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
tp5 实现列表数据根据状态排序
Oct 18 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 PHP
PHP实现两种排课方式
Jun 26 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
ThinkPHP实现跨模块调用操作方法概述
2014/06/20 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php实现的单一入口应用程序实例分析
2015/09/23 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
thinkPHP5框架实现基于ajax的分页功能示例
2018/06/12 PHP
一次因composer错误使用引发的问题与解决
2019/03/06 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
javascript中cookie对象用法实例分析
2015/01/30 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
js实现简单的选项卡效果
2017/02/23 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
解决Vue2.x父组件与子组件之间的双向绑定问题
2018/03/06 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
解决Vue动态加载本地图片问题
2019/10/09 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
详解Python中的文本处理
2015/04/11 Python
Python实现二叉堆
2016/02/03 Python
Python使用django框架实现多人在线匿名聊天的小程序
2017/11/29 Python
Python元组知识点总结
2019/02/18 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
纯CSS3打造属于自己的“小黄人”
2016/03/14 HTML / CSS
教师简历自我评价
2014/02/03 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
校长师德表现自我评价
2015/03/05 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript