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语法速查表
Dec 06 PHP
用php实现的下载css文件中的图片的代码
Feb 08 PHP
关于UEditor编辑器远程图片上传失败的解决办法
Aug 31 PHP
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
May 17 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
PHP从数组中删除元素的四种方法实例
May 12 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
PHP实现的简单sha1加密功能示例
Aug 27 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
Nov 24 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使浏览器直接下载pdf文件的方法
2013/11/15 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
php给图片添加文字水印方法汇总
2015/08/27 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
js获取提交的字符串的字节数
2009/02/09 Javascript
JQuery 引发两次$(document.ready)事件
2010/01/15 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
JS实现跟随鼠标闪烁转动色块的方法
2015/02/26 Javascript
js正则表达式验证邮件地址
2015/11/12 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
深入理解js中this的用法
2016/05/28 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
js设置随机切换背景图片的简单实例
2017/11/12 Javascript
Vue常见面试题整理【值得收藏】
2018/09/20 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
python实现图像识别功能
2018/01/29 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
python实现图片转字符画
2021/02/19 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
META-INF文件夹中的MANIFEST.MF的作用
2016/06/21 面试题
仓库管理制度
2014/01/21 职场文书
数学国培研修感言
2014/02/13 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
SpringBoot实现quartz定时任务可视化管理功能
2021/08/30 Java/Android
SQL Server实现分页方法介绍
2022/03/16 SQL Server
APP界面设计技巧和注意事项
2022/04/29 杂记