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 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
一段php加密解密的代码
Jul 16 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
PHP函数常用用法小结
Feb 08 PHP
php 格式化数字的时候注意数字的范围
Apr 13 PHP
PHP扩展模块memcached长连接使用方法分析
Dec 24 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
PHP遍历数组的方法汇总
Apr 30 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
PHP convert_cyr_string()函数讲解
Feb 13 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导入导出excel实例
2013/10/25 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
php压缩文件夹最新版
2018/07/18 PHP
在父页面调用子页面的JS方法
2013/09/29 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
jquery自定义滚动条插件示例分享
2014/02/21 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
js实现仿爱微网两级导航菜单效果代码
2015/08/31 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
Vue使用axios出现options请求方法
2019/05/30 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
Python实现获取域名所用服务器的真实IP
2015/10/25 Python
python在不同层级目录import模块的方法
2016/01/31 Python
Python统计单词出现的次数
2018/04/04 Python
selenium python 实现基本自动化测试的示例代码
2019/02/25 Python
int在python中的含义以及用法
2019/06/27 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
django数据库自动重连的方法实例
2019/07/21 Python
python pygame实现滚动横版射击游戏城市之战
2019/11/25 Python
详解python的变量缓存机制
2021/01/24 Python
CSS3中文字镂空、透明值、阴影效果设置示例小结
2016/03/07 HTML / CSS
让IE支持HTML5的方法
2012/12/11 HTML / CSS
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
学生会竞选自荐信
2013/10/12 职场文书
国庆节演讲稿范文2014
2014/09/19 职场文书
六年级学生期末评语
2014/12/26 职场文书
财务人员岗位职责
2015/02/03 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
天鹅湖观后感
2015/06/09 职场文书
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle