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中的boolean(布尔)类型详解
Oct 28 PHP
PHP禁止个别IP访问网站
Oct 30 PHP
PHP内核探索:变量概述
Jan 30 PHP
php switch语句多个值匹配同一代码块应用示例
Jul 29 PHP
如何让CI框架支持service层
Oct 29 PHP
PHP判断浏览器、判断语言代码分享
Mar 05 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
php对文件夹进行相关操作(遍历、计算大小)
Nov 04 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
Dec 19 PHP
根据key删除数组中指定的元素实现方法
Mar 02 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 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 数组和字符串互相转换实现方法
2013/03/26 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
JavaScript兼容浏览器FF/IE技巧
2016/08/14 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JavaScript该如何学习 怎样轻松学习JavaScript
2017/06/12 Javascript
微信小程序表单验证功能完整实例
2017/12/01 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
JavaScript创建表格的方法
2020/04/13 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
详细分析React 表单与事件
2020/07/08 Javascript
Python fileinput模块使用实例
2015/06/03 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
pygame实现成语填空游戏
2019/10/29 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python属于跨平台语言码
2020/06/09 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
用Python 执行cmd命令
2020/12/18 Python
2014年两会学习心得体会
2014/03/10 职场文书
苦儿流浪记读书笔记
2015/07/01 职场文书
大学生村官工作心得体会
2016/01/23 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
Python借助with语句实现代码段只执行有限次
2022/03/23 Python
Python中npy和mat文件的保存与读取
2022/04/24 Python