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 相关文章推荐
The specified CGI application misbehaved by not returning a complete set of HTTP headers
Mar 31 PHP
PHP 自定义错误处理函数trigger_error()
Mar 26 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
PHP实现图片压缩的两则实例
Jul 19 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
PHP-FPM运行状态的实时查看及监控详解
Nov 18 PHP
php json_encode与json_decode详解及实例
Dec 13 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
Oct 24 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 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 远程图片保存到本地的函数类
2008/12/08 PHP
php通过COM类调用组件的实现代码
2012/01/11 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
Codeigniter的dom类用法实例
2015/06/26 PHP
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
JS+CSS实现网页加载中的动画效果
2017/10/27 Javascript
vue-router的使用方法及含参数的配置方法
2018/11/13 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
监控Nodejs的性能实例代码
2019/07/02 NodeJs
js实现图片上传即时显示效果
2019/09/30 Javascript
JS实现吸顶特效
2020/01/08 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
el-table树形表格表单验证(列表生成序号)
2020/05/31 Javascript
Python中Collection的使用小技巧
2014/08/18 Python
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
Python实现1-9数组形成的结果为100的所有运算式的示例
2017/11/03 Python
matplotlib.pyplot画图 图片的二进制流的获取方法
2018/05/24 Python
python爬虫获取小区经纬度以及结构化地址
2018/12/30 Python
python生成requirements.txt的两种方法
2019/09/18 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
Python Json数据文件操作原理解析
2020/05/09 Python
html5拖拽应用记录及注意点
2020/05/27 HTML / CSS
苹果音乐订阅:Apple Music
2018/08/02 全球购物
优秀大学生推荐信范文
2013/11/28 职场文书
会议接待欢迎词
2014/01/12 职场文书
汽车维修工岗位职责
2014/02/12 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript