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&mysql(四)
Oct 09 PHP
PHP中文汉字验证码
Apr 08 PHP
PHP 文件扩展名 获取函数
Jun 03 PHP
php foreach、while性能比较
Oct 15 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
Jun 24 PHP
深入file_get_contents函数抓取内容失败的原因分析
Jun 25 PHP
编译PHP报错configure error Cannot find libmysqlclient under usr的解决方法
Jun 27 PHP
PHP实现全角字符转为半角方法汇总
Jul 09 PHP
php实现生成验证码实例分享
Apr 10 PHP
magento后台无法登录解决办法的两种方法
Dec 09 PHP
Laravel中任务调度console使用方法小结
May 07 PHP
windows 2008r2+php5.6.28环境搭建详细过程
Jun 18 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/01/05 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
PHP英文字母大小写转换函数小结
2014/05/03 PHP
Yii2-GridView 中让关联字段带搜索和排序功能示例
2017/01/21 PHP
PHP封装XML和JSON格式数据接口操作示例
2019/03/06 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
延时重复执行函数 lLoopRun.js
2007/05/08 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
实例详解JavaScript中setTimeout函数的执行顺序
2017/07/12 Javascript
JS实现电商放大镜效果
2017/08/24 Javascript
微信小程序的生命周期的详解
2017/10/19 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
在Vue里如何把网页的数据导出到Excel的方法
2020/09/30 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
python中关于时间和日期函数的常用计算总结(time和datatime)
2013/03/08 Python
浅析Python中的多进程与多线程的使用
2015/04/07 Python
Python序列化基础知识(json/pickle)
2017/10/19 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
2019/06/03 Python
Python实现随机爬山算法
2021/01/29 Python
Expedia西班牙:预订酒店、机票、旅行和廉价度假套餐
2019/04/10 全球购物
高中政治教学反思
2014/01/18 职场文书
个人课题方案
2014/05/08 职场文书
大学新生入学教育方案
2014/05/16 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
2014年环卫工作总结
2014/11/22 职场文书
保护环境的宣传语
2015/07/13 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js