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 18 PHP
php数组总结篇(一)
Sep 30 PHP
zend framework多模块多布局配置
Feb 26 PHP
求PHP数组最大值,最小值的代码
Oct 31 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
php将图片保存为不同尺寸图片的图片类实例
Mar 30 PHP
php简单生成随机数的方法
Jul 30 PHP
zend framework重定向方法小结
May 28 PHP
Yii统计不同类型邮箱数量的方法
Oct 18 PHP
Yii 2中的load()和save()示例详解
Aug 03 PHP
Thinkphp集成抖音SDK的实现方法
Apr 28 PHP
深入分析PHP设计模式
Jun 15 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 is_file()和is_dir()用于遍历目录时用法注意事项
2010/03/02 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
php下pdo的mysql事务处理用法实例
2014/12/27 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
PHP对称加密算法(DES/AES)类的实现代码
2017/11/14 PHP
基于PHP实现的多元线性回归模拟曲线算法
2018/01/30 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
js查找父节点的简单方法
2008/06/28 Javascript
Ext 表单布局实例代码
2009/04/30 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
一个JS的日期格式化算法示例
2013/07/31 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
详解Vue.js分发之作用域槽
2017/06/13 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
Python标准库之sqlite3使用实例
2014/11/25 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Tensorflow 多线程设置方式
2020/02/06 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
html+css3实现的登录界面
2020/12/09 HTML / CSS
大学生毕业自我鉴定范文
2013/09/19 职场文书
仓库班组长岗位职责
2013/12/12 职场文书
端午节粽子促销活动方案
2014/02/02 职场文书
会计专业自我鉴定
2014/02/10 职场文书
《理想》教学反思
2014/02/17 职场文书
母婴店促销方案
2014/03/05 职场文书
房屋转让协议书
2014/04/11 职场文书
社区义诊活动总结
2014/04/30 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
护士辞职信怎么写
2015/02/27 职场文书
会计求职自荐信
2015/03/26 职场文书
道歉信怎么写
2015/05/12 职场文书
redis哨兵常用命令和监控示例详解
2021/05/27 Redis