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 相关文章推荐
substr()函数中文版
Oct 09 PHP
php查找指定目录下指定大小文件的方法
Nov 28 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
php使用ffmpeg获取视频信息并截图的实现方法
May 03 PHP
PHP使用mysql与mysqli连接Mysql数据库用法示例
Jul 07 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
PHP实现生成带背景的图形验证码功能
Oct 03 PHP
PHP+JS实现的商品秒杀倒计时用法示例
Nov 15 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
PHP7内核之Reference详解
Mar 14 PHP
深入分析PHP设计模式
Jun 15 PHP
php的lavarel框架中join和orWhere的用法
Dec 28 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
模仿OSO的论坛(四)
2006/10/09 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
2010/03/14 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
EasyUI折叠表格层次显示detailview详解及实例
2016/12/28 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
node.js express中app.param的用法详解
2017/07/16 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Python中使用gzip模块压缩文件的简单教程
2015/04/08 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
Python代码缩进和测试模块示例详解
2018/05/07 Python
Python 使用PIL numpy 实现拼接图片的示例
2018/05/08 Python
python pandas生成时间列表
2019/06/29 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python中count函数简单用法
2020/01/05 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
公司市场部岗位职责
2013/12/02 职场文书
大学生社会实践方案
2014/05/11 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
2014基建处领导班子“四风”对照检查材料思想汇报
2014/10/04 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
结婚幸福感言
2015/08/01 职场文书
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python