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 相关文章推荐
ftp类(example.php)
Oct 09 PHP
PHP+Tidy-完美的XHTML纠错+过滤
Apr 10 PHP
php读取html并截取字符串的简单代码
Nov 30 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
Mar 13 PHP
php+mysqli实现批量替换数据库表前缀的方法
Dec 29 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
php使用Jpgraph绘制复杂X-Y坐标图的方法
Jun 10 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
Centos PHP 扩展Xchche的安装教程
Jul 09 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 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提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
2016/11/20 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
javascript 弹出层组件(升级版)
2011/05/12 Javascript
jquery怎样实现ajax联动框(二)
2013/03/08 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
node.js实现博客小爬虫的实例代码
2016/10/08 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
2017/03/25 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
[37:03]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第二场 12.16
2020/12/18 DOTA
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python 类的特殊成员解析
2018/06/20 Python
Python3.6.x中内置函数总结及讲解
2019/02/22 Python
python global关键字的用法详解
2019/09/05 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
python中实现栈的三种方法
2020/12/19 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
利用Storage Event实现页面间通信的示例代码
2018/07/26 HTML / CSS
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
元旦寄语大全
2014/04/10 职场文书
给朋友的道歉短信
2015/05/12 职场文书
企业法律事务工作总结
2015/08/11 职场文书
对象析构函数__del__在Python中何时使用
2022/03/22 Python
Java死锁的排查
2022/05/11 Java/Android