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 中文处理函数集合
Aug 27 PHP
PHP中strtotime函数使用方法分享
Jan 10 PHP
php模拟js函数unescape的函数代码
Oct 20 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
Oct 16 PHP
PHP中strtr字符串替换用法详解
Nov 26 PHP
php实现读取内存顺序号
Mar 29 PHP
php关键字仅替换一次的实现函数
Oct 29 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
PHP新特性详解之命名空间、性状与生成器
Jul 18 PHP
php检查函数必传参数是否存在的实例详解
Aug 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的历史和优缺点
2006/10/09 PHP
PHP SEO优化之URL优化方法
2011/04/21 PHP
smarty模板中拼接字符串的方法
2014/02/14 PHP
分享一个Laravel好用的Cache宏
2015/03/02 PHP
php计算指定目录下文件占用空间的方法
2015/03/13 PHP
twig模板常用语句实例小结
2016/02/04 PHP
PHP如何通过带尾指针的链表实现'队列'
2020/10/22 PHP
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
javascript数组的使用
2013/03/28 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
Jquery中Event对象属性小结
2015/02/27 Javascript
js轮播图无缝滚动效果
2017/06/17 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
js实现微信聊天界面
2020/08/09 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
原生JS实现音乐播放器
2021/01/26 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
python基础教程之自定义函数介绍
2014/08/29 Python
python微信跳一跳系列之棋子定位颜色识别
2018/02/26 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
python sorted函数的小练习及解答
2019/09/18 Python
python圣诞树编写实例详解
2020/02/13 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
毕业自荐书
2013/12/09 职场文书
和平主题的演讲稿
2014/01/12 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
加入学生会自荐书
2015/03/05 职场文书