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 相关文章推荐
递归列出所有文件和目录
Oct 09 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
PHP文件上传判断file是否己选择上传文件的方法
Nov 10 PHP
php中addslashes函数与sql防注入
Nov 17 PHP
php支付宝接口用法分析
Jan 04 PHP
php文件上传你必须知道的几点
Oct 20 PHP
解读PHP的Yii框架中请求与响应的处理流程
Mar 17 PHP
常用PHP数组排序函数归纳
Aug 08 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
Laravel框架实现修改登录和注册接口数据返回格式的方法
Aug 17 PHP
PHP赋值的内部是如何跑的详解
Jan 13 PHP
php的无刷新操作实现方法分析
Feb 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制作万年历
2015/01/07 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
Yii框架的redis命令使用方法简单示例
2019/10/15 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
文本加密解密
2006/06/23 Javascript
JavaScript 学习初步 入门教程
2010/03/25 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
轻松创建nodejs服务器(8):非阻塞是如何实现的
2014/12/18 NodeJs
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
angularJS中router的使用指南
2015/02/09 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
js实现字符全排列算法的简单方法
2017/05/01 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
python素数筛选法浅析
2018/03/19 Python
python删除某个字符
2018/03/19 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
python psutil监控进程实例
2019/12/17 Python
python yield和Generator函数用法详解
2020/02/10 Python
Python如何对XML 解析
2020/06/28 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
《孔子拜师》教学反思
2014/02/24 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
学生自我评语
2015/01/04 职场文书
教学督导岗位职责
2015/04/10 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书