`
buliedian
  • 浏览: 1223789 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Understanding PHP Opcode (Forward)

阅读更多

《Understanding OPcode》
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL,举个例子,比如你写下了如下的PHP代码:

  1. <?php
  2. echo "Hello World";
  3. $a = 1 + 1;
  4. echo $a;
  5. ?>

PHP执行这段代码会经过如下4个步骤(确切的来说,应该是PHP的语言引擎Zend)

1. Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)

2. Parsing, 将Tokens转换成简单而有意义的表达式

3. Compilation, 将表达式编译成Opocdes

4. Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

题外话:现在有的Cache比如APC,可以使得PHP缓存住Opcodes,这样,每次有请求来临的时候,就不需要重复执行前面3步,从而能大幅的提高PHP的执行速度。

那什么是Lexing? 学过编译原理的同学都应该对编译原理中的词法分析步骤有所了解,Lex就是一个词法分析的依据表。 Zend/zend_language_scanner.c会根据Zend/zend_language_scanner.l(Lex文件),来对输入的 PHP代码进行词法分析,从而得到一个一个的“词”,PHP4.2开始提供了一个函数叫token_get_all,这个函数就可以讲一段PHP代码 Scanning成Tokens;
如果用这个函数处理我们开头提到的PHP代码,将会得到如下结果:

  1. Array
  2. (
  3. [0] => Array
  4. (
  5. [0] => 367
  6. [1] => Array
  7. (
  8. [0] => 316
  9. [1] => echo
  10. )
  11. [2] => Array
  12. (
  13. [0] => 370
  14. [1] =>
  15. )
  16. [3] => Array
  17. (
  18. [0] => 315
  19. [1] => "Hello World"
  20. )
  21. [4] => ;
  22. [5] => Array
  23. (
  24. [0] => 370
  25. [1] =>
  26. )
  27. [6] => =
  28. [7] => Array
  29. (
  30. [0] => 370
  31. [1] =>
  32. )
  33. [8] => Array
  34. (
  35. [0] => 305
  36. [1] => 1
  37. )
  38. [9] => Array
  39. (
  40. [0] => 370
  41. [1] =>
  42. )
  43. [10] => +
  44. [11] => Array
  45. (
  46. [0] => 370
  47. [1] =>
  48. )
  49. [12] => Array
  50. (
  51. [0] => 305
  52. [1] => 1
  53. )
  54. [13] => ;
  55. [14] => Array
  56. (
  57. [0] => 370
  58. [1] =>
  59. )
  60. [15] => Array
  61. (
  62. [0] => 316
  63. [1] => echo
  64. )
  65. [16] => Array
  66. (
  67. [0] => 370
  68. [1] =>
  69. )
  70. [17] => ;
  71. )

分析这个返回结果我们可以发现,源码中的字符串,字符,空格,都会原样返回。每个源代码中的字符,都会出现在相应的顺序处。而,其他的比如标签,操作符,语句,都会被转换成一个包含俩部分的Array: Token ID (也就是在Zend内部的改Token的对应码,比如,T_ECHO,T_STRING),和源码中的原来的内容。
接下来,就是Parsing阶段了,Parsing首先会丢弃Tokens Array中的多于的空格,然后将剩余的Tokens转换成一个一个的简单的表达式
1. echo a constant string

2. add two numbers together

3. store the result of the prior expression to a variable

4. echo a variable

然后就改Compilation阶段了,它会把Tokens编译成一个个op_array, 每个op_arrayd包含如下5个部分:

1. Opcode数字的标识,指明了每个op_array的操作类型,比如add , echo

2. 结果 存放Opcode结果

3. 操作数1 给Opcode的操作数

4. 操作数2

5. 扩展值 1个整形用来区别被重载的操作符

比如,我们的PHP代码会被Parsing成:

* ZEND_ECHO ‘Hello World’
* ZEND_ADD ~0 1 1
* ZEND_ASSIGN !0 ~0
* ZEND_ECHO !0

呵呵,你可能会问了,我们的$a去那里了?

恩,这个要介绍操作数了,每个操作数都是由以下俩个部分组成:

a) op_type : 为IS_CONST, IS_TMP_VAR, IS_VAR, IS_UNUSED, or IS_CV

b) u,一个联合体,根据op_type的不同,分别用不同的类型保存了这个操作数的值(const)或者左值(var)

而对于var来说,每个var也不一样

IS_TMP_VAR, 顾名思义,这个是一个临时变量,保存一些op_array的结果,以便接下来的op_array使用,这种的操作数的u保存着一个指向变量表的一个句柄(整数),这种操作数一般用~开头,比如~0,表示变量表的0号未知的临时变量

IS_VAR 这种就是我们一般意义上的变量了,他们以$开头表示

IS_CV 表示ZE2.1/PHP5.1以后的编译器使用的一种cache机制,这种变量保存着被它引用的变量的地址,当一个变量第一次被引用的时候,就会被CV起来,以后对这个变量的引用就不需要再次去查找active符号表了,CV变量以!开头表示。
这么看来,我们的$a被优化成!0了。

分享到:
评论

相关推荐

    PHP 5.3 OPCODE工具(用于zend 加密php 5.3分析,逆向)

    php opcode的反解,用于分析PHP ,逆向PHP 加密,由OPCODE转换PHP代码. WINDOWS 版本的使用: 开始,运行,CMD 进入PHP所在目录,执行: Php.exe –c php.ini 111.php 回车,即可查看:111.php 的OPCODE值. 用这个工具,可以...

    深入理解PHP之OpCode原理详解

    此文主要基于《 Understanding OPcode》和 网络,根据个人的理解和修改,特记录下来 : PHP代码: &lt;?php echo "Hello World"; $a = 1 + 1; echo $a; ?&gt; PHP执行这段代码会经过如下4个步骤: 1. Scanning...

    OpcodeMap

    在IT领域,尤其是计算机编程和软件开发中,"OpcodeMap"是一个重要的概念,尤其是在低级语言和编译器设计中。OpcodeMap通常指的是一个表格或数据结构,它映射了特定编程语言或处理器架构的机器指令(opcode)与其功能...

    PHP中opcode缓存简单用法分析

    在PHP中,opcode缓存是一个重要的性能优化技术,它通过缓存PHP脚本编译后的中间代码来提高应用程序的执行效率。以下是针对标题“PHP中opcode缓存简单用法分析”及描述中的知识点的详细说明: 1. opcode的概念:在...

    利用PHP扩展vld查看PHP opcode操作步骤

    标题中的“利用PHP扩展vld查看PHP opcode操作步骤”指的是使用vld扩展来查看PHP脚本的中间代码,也就是opcode。在PHP中,源代码会被编译成一系列的opcode,这些opcode是解释器可以直接执行的低级指令。vld...

    深化理解PHP之OpCode原理详解_.docx

    PHP OpCode 原理详解 OPCode 是一种 PHP 脚本编译后的中间语言,就像 Java 的 ByteCode 或者 .NET 的 MSL。 PHP 代码执行过程可以分为四个步骤:Scanning、Parsing、Compilation 和 Execution。 1. Scanning...

    opcode编译器机器码

    汇编语言是一种低级编程语言,它与特定的计算机架构紧密相关,每个指令都对应一个特定的机器码,也称为opcode。本篇文章将深入探讨opcode、汇编编译器以及它们在计算机体系结构中的作用。 首先,让我们理解什么是...

    PHP7如何开启Opcode打造强悍性能详解

    标题中的“PHP7如何开启Opcode打造强悍性能详解”是指通过启用PHP7的内置模块Opcache,提升PHP脚本的执行效率,降低CPU和内存的消耗。描述中提到,Opcache是PHP官方公司Zend开发的优化加速组件,能够将PHP代码预编译...

    Svin的OpCode教程

    ### Svin的OpCode教程知识点解析 #### 一、概览 Svin的OpCode教程是一系列关于操作码(OpCode)的详细教学资源,专为渴望深入了解底层计算机原理及编程技术的学习者设计。该教程采取实践导向的方式,强调通过实际...

    Opcode轻量级的碰撞检测库

    Opcode是游戏开发和3D应用中广泛使用的轻量级碰撞检测库,尤其适用于不需复杂物理引擎的场景。它的设计目标是提供高效、精确的几何体碰撞检测,以满足各种实时交互需求。Ogre Opcode是Ogre 3D渲染引擎的一个扩展模块...

    Opcode定义和查询

    在计算机科学领域,尤其是硬件和低级编程中,"Opcode"是至关重要的概念。Opcode,全称为“操作码”,是计算机指令系统中的一个关键部分,它代表了指令集中的每一条指令的功能。当我们谈论Opcode时,我们实际上是在...

    Opcode.zip

    Opcode,也被称为操作码,是计算机指令系统中的一个重要概念。它是指令集架构(ISA)的一部分,用于指示CPU执行特定操作的二进制代码。在CPU执行任何计算或控制任务时,它首先解码指令,而指令的核心部分就是Opcode...

    常用 Opcode命令大集合

    ### 常用Opcode命令详解 #### 一、概述 在深入探讨具体Opcode命令之前,我们先来了解一些基本概念。Opcode(操作码)是指在计算机编程语言中用于表示指令集的一部分,它决定了处理器将执行何种类型的操作。本文将...

    汇编指令之OpCode快速入门

    ### 汇编指令之OpCode快速入门 #### 一、引言 在计算机科学领域,特别是编程语言底层实现方面,汇编语言占据着举足轻重的地位。它是一种低级语言,允许程序员直接控制硬件资源,对于系统编程、逆向工程、安全研究等...

    PHP内核学习教程之php opcode内核实现

    PHP内核的学习涉及理解PHP程序执行的核心机制,其中包括了PHP内核的编译过程以及PHP opcode(操作码)在Zend虚拟机(ZendVM)中的实现。PHP opcode是PHP源代码在编译后生成的一种中间代码,用于PHP脚本的执行。在...

    为PHP5.4开启Zend OPCode缓存

    标题中的“为PHP5.4开启Zend OPCode缓存”是指在PHP 5.4版本中启用 Zend OPCode 缓存这一功能。OPCode缓存是PHP的一种优化机制,它将PHP源代码编译成中间代码(OPCode)并存储在内存中,以避免每次请求时重复编译,...

    基于卷积神经网络的WebShell检测工具,可以检测JSP和PHP类型文件,以opcode和bytecode作为检测特征

    【作品名称】:基于卷积神经网络的WebShell检测工具,可以检测JSP和PHP类型文件,以opcode和bytecode作为检测特征,基于Django框架 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、...

Global site tag (gtag.js) - Google Analytics