PHP内核探索之解释器的执行过程

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信息的输出。

(0)

相关推荐

  • PHP内核探索:变量存储与类型使用说明

    先回答前面一节的那个问题吧. 复制代码 代码如下: <?php    $foo = 10;    $bar = 20; function change() {        global $foo;        //echo '函数内部$foo = '.$foo.'<br />';        //如果不把$bar定义为global变量,函数体内是不能访问$bar的        $bar = 0;        $foo++;    } change();    echo $foo

  • php设计模式 Interpreter(解释器模式)

    复制代码 代码如下: <?php /** * 解释器 示例 * * @create_date: 2010-01-04 */ class Expression { function interpreter($str) { return $str; } } class ExpressionNum extends Expression { function interpreter($str) { switch($str) { case "0": return "零"

  • PHP内核探索:哈希表碰撞攻击原理

    下面通过图文并茂的方式给大家展示PHP内核探索:哈希表碰撞攻击原理. 最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招.本文结合PHP内核源码,聊一聊这种攻击的原理及实现.  哈希表碰撞攻击的基本原理 哈希表是一种查找效率极高的数据结构,很多语言都在内部实现了哈希表.PHP中的哈希表是一种极为重要的数据结构,不但用于表示Array数据类型,还在Zend虚拟机内部用于存储上下文环境信息(执行上下文的变量及函数均使用哈希表结

  • PHP设计模式之解释器模式的深入解析

    解释器(Interpreter)模式,它包括一个具有复合类分层结构的文法表现,规则是映射到类,跟随在文法后面的表达式可以被转换成一个抽象的语法树,除了复合模式的实例对象图外,没有别的内容. 树是一个抽象的名词,因为实际上大多数时候它是一个表达式的抽象表现,它忽略了可能有一个字符串,也可能有一个数据结构的具体表达式,(例如,在PHP中,"A"和"\x41"是相同抽象字面值的不同具体表现),通过逻辑规则解耦结果,使解释过程大大简化. 解释器不是一个很常见的模式,但对于简

  • PHP内核探索:变量概述

    现代编程语言中的基本元素主要有:变量,流程控制接口,函数等等.我能否不使用变量来编写程序呢? 这显然是可以的,例如: 复制代码 代码如下: <?php    echo "Hello AndHM";?> 这个程序很简单,输出一个字符串内容. 就和我们仅仅使用二进制也能编程一样,不使用变量也能完成大部分的工作,不使用变量我们的程序将丧失极大的灵活性, 变量可以让我们将值存储起来,以便在程序的其他地方使用,或者通过计算保存新的值. 变量具有三个基本特性: 名称.变量的标示符.就像

  • PHP内核探索之变量

    php变量组成部分: 变量名:php语言的变量名以$开头+英文/下划线,可以包含数字.下划线.字母,区分大小写.同时PHP也支持复合变量,形如$$A,增加了php的动态性. 类型:php属于弱类型语言,可以赋值任意类型的值. 内容:在同一时刻只能有一种值. php语言中存在8中数据类型,分为三大类: 1. 标量类型:Boolean,integer,float,string: 2. 复合类型:object,array: 3. 特殊类型:NULL,resource: php作为一种弱类型语言,在实现

  • PHP内核探索之解释器的执行过程

    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后,生成以一个可

  • 探讨JavaScript语句的执行过程

    废话不多说,直奔主题了.javascript的运行原理总结如下: 1.按照html文档流顺序执行javascript代码 浏览器是按照文档流从上到下逐步解析页面结构和信息的,javascript代码作为嵌入的脚本作为html文档的组成部分,所以javascript代码在加载时的执行顺序也是根据脚本标签<script>的出现顺序来确定的. 如果通过脚本标签<script>的src属性来引入外部.js文件,那么它也将按照其语句出现的顺序来执行,而且执行过程是文档加载的一部分.不会因为是

  • 游览器中javascript的执行过程(图文)

    1. 大多数游览器的组件构成如图      在最底层的三个组件分别是网络,UI后端和js解释器.作用如下: (1)网络- 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作 (2)UI 后端- 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口 (3)JS解释器- 用来解释执行JS代码 ps:上图和知识点主要来自<HOW BROWSERS WORK: BEHIND THE SCENES OF MODERN WEB BR

  • Java程序执行过程及内存机制详解

    本讲将介绍Java代码是如何一步步运行起来的,其中涉及的编译器,类加载器,字节码校验器,解释器和JIT编译器在整个过程中是发挥着怎样的作用.此外还会介绍Java程序所占用的内存是被如何管理的:堆.栈和方法区都各自负责存储哪些内容.最后用一小块代码示例来帮助理解Java程序运行时内存的变化. Java程序执行过程 步骤 1: 写源代码,源代码将以.java的文件格式保存在电脑硬盘中. 步骤 2: 编译器(compiler)检查是否存在编译期错误(例如缺少分号,关键字拼写错误等).若通过检测,编译器

  • Python字节码与程序执行过程详解

    目录 问题: 1. 执行过程 2. 字节码 3. 源码编译 三种编译模式: 4. PyCodeObject 5. 反编译 6. pyc 问题: 我们每天都要编写一些Python程序,或者用来处理一些文本,或者是做一些系统管理工作.程序写好后,只需要敲下python命令,便可将程序启动起来并开始执行: $ python some-program.py 那么,一个文本形式的.py文件,是如何一步步转换为能够被CPU执行的机器指令的呢?此外,程序执行过程中可能会有.pyc文件生成,这些文件又有什么作用

  • python虚拟机解释器及运行过程

    目录 python虚拟机解释器 什么是python解释器 1. 解释性语言和编译性语言 2. python解释器 3. python程序运行过程 python虚拟机 关于python的性能 python虚拟机解释器 我闲来翻了翻几年前就买的一本python的书,O'REILLY的[python学习手册],中译版,很厚. 可惜,我看得非常少,这也是为什么我在简历上关于python顶天也就写个熟悉,就这都担心找虐.虽说java的学习价值更大,但是学了平时用不上,忘得快.再加上做题的时候,感觉还是用p

  • oracle sql执行过程(流程图)

    Oracle sql执行流程图_SQL执行过程一.sql语句的执行步骤:1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义.2) 语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限.3)视图转换,将涉及视图的查询语句转换为相应的对基表查询语句.4)表达式转换, 将复杂的 SQL 表达式转换为较简单的等效连接表达式.5)选择优化器,不同的优化器一般产生不同的"执行计划"  6)选择连接方式,ORACLE有三种连接方式,对多表连接ORACLE可选择适当的连

  • JavaScript 函数的执行过程

    1. 每一个JavaScript函数都是Function对象的一个实例, 它有一个仅供JavaScript引擎存取的内部属性[[Scope]]. 这个[[Scope]]存储着一个作用域的集合, 这个集合就叫"作用域链", 集合中存储着"可变对象"VO或"活动对象"AO(AO比VO多this和arguments属性). 2. 当函数被创建后, 其父级作用域的作用域链中的所有可变对象会被加入到它的[[scope]]中(如果父作用域是全局, 那么当前函

  • C#计算程序执行过程花费时间的方法

    本文实例讲述了C#计算程序执行过程花费时间的方法.分享给大家供大家参考.具体如下: 计算执行完程序花费的时间: void AddInfo() { System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sw.Start(); for (int i = 0; i < 1000; i++) { Console.WriteLine(i.ToString()); System.Threading.Thread.Sleep

随机推荐