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+Html+缓存
Nov 25 PHP
php学习之变量的使用
May 29 PHP
JpGraph php柱状图使用介绍
Aug 23 PHP
一个简单的网页密码登陆php代码
Jul 17 PHP
深入理解用mysql_fetch_row()以数组的形式返回查询结果
Jun 05 PHP
探讨:如何通过stats命令分析Memcached的内部状态
Jun 14 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
PHP调试函数和日志记录函数分享
Jan 31 PHP
php使用explode()函数将字符串拆分成数组的方法
Feb 17 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
PHP tp5中使用原生sql查询代码实例
Oct 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
php下通过curl抓取yahoo boss 搜索结果的实现代码
2011/06/10 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
javascript中typeof操作符和constucor属性检测
2015/02/26 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
Easyui Datagrid自定义按钮列(最后面的操作列)
2017/07/13 Javascript
js自定义弹框插件的封装
2020/08/24 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
vue-froala-wysiwyg 富文本编辑器功能
2019/09/19 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
Python正则表达式使用经典实例
2016/06/21 Python
import的本质解析
2017/10/30 Python
python每天定时运行某程序代码
2019/08/16 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
2020/03/02 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
世界上最好的威士忌和烈性酒购买网站:The Whisky Exchange
2016/11/20 全球购物
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
公司面试感谢信
2014/02/01 职场文书
土木工程专业推荐信
2014/02/19 职场文书
高一学生期末评语
2014/04/25 职场文书
预备党员转正考核材料
2014/06/03 职场文书
2015年市场部工作总结
2015/04/30 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
污染环境建议书
2015/09/14 职场文书
初中语文教学研修日志
2015/11/13 职场文书
高中班长竞选稿
2015/11/20 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书