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 COOKIE立即生效,不用刷新就可以使用
Mar 09 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 PHP
php实现图片缩放功能类
Dec 18 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
Jun 24 PHP
Zend Framework教程之Zend_Layout布局助手详解
Mar 04 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
May 28 PHP
Adnroid 微信内置浏览器清除缓存
Jul 11 PHP
php获取给定日期相差天数的方法分析
Feb 20 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
php-fpm重启导致的程序执行中断问题详解
Apr 29 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学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP has encountered a Stack overflow问题解决方法
2014/11/03 PHP
深入理解PHP 数组之count 函数
2016/06/13 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
JS 判断代码全收集
2009/04/28 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
Javascript高级技巧分享
2014/02/25 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
JavaScript判断用户是否对表单进行了修改的方法
2015/03/18 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
python3爬虫怎样构建请求header
2018/12/23 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
Python+opencv+pyaudio实现带声音屏幕录制
2019/12/23 Python
基于Python+QT的gui程序开发实现
2020/07/03 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
python爬虫筛选工作实例讲解
2020/11/23 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
台湾网购生鲜第一品牌:i3Fresh爱上新鲜
2017/10/26 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
物理教学随笔感言
2014/02/22 职场文书
2014最新开业庆典策划方案(5篇)
2014/09/15 职场文书
小学六一儿童节活动总结
2015/05/05 职场文书