php windows vld,PHP之opcode及VLD使用

article/2025/9/18 16:40:22

OpCode,即Operation Code,操作码。通常是指计算机指令中的一部分,用于指定要执行的操作, 指令的格式和规范由处理器的指令规范指定。

通常opcode还有另一种称谓:字节码(byte codes)。例如Java编译后生成的class文件。

PHP中的opcode则属于后者,PHP构建在Zend虚拟机(Zend VM)之上。PHP的opcode就是Zend虚拟机中的指令。当Zend 引擎完成对脚本代码的编译后,便将它们生成可以直接运行的中间代码,即OpCode。

比如写了如下PHP代码:

echo "Hello World!";

$a = 1 +1;

echo $a;

?>

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

1. Scanning(Lexing) ,Zend Engine(Zend引擎),调用词法分析器(Lex生成的,源文件在Zend/zend_language_sanner.l),将我们要执行的PHP源文件,去掉空格 ,注释,分割成一个一个的语言片段(Tokens)。

2. Parsing, Zend引擎会将得到的token forward给语法分析器(yacc生成, 源文件在 Zend/zend_language_parser.y),将Tokens转换成简单而有意义的表达式。

3. Compilation, 将表达式编译成Opocdes,opcode一般会以op array的形式存在。

4. Execution, Zend引擎调用zend_executor来顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

8a4201869abbfd0705a82f3f351e8d27.png

每一次请求到来的时候,都是这样一个过程,但是很明显每次都需要编译,是非常低效的。因为PHP源码不变,OpCode就不会改变,所以前面的步骤就不需要每次都进行,这就是所谓的OpCode缓存,就是将第三步生成的OpCode缓存下来,这样下一次请求来的时候就不需要前三步,直接执行OpCode就可以了,从而可以大大的提升执行速度。

关于Opcode缓存

详细的opcode编译过程可以看鸟哥的博客《深入理解PHP原理之OpCode》。

那如何可以看到我们的PHP脚本,最终被编译成什么样的呢? 也就是说,OpCode长的什么样子呢? 在PECL中已经有这样的模块,可以让我们直接使用了,那就是由 Derick Rethans开发的VLD (Vulcan Logic Dissassembler)模块。只需要下载这个模块,并把他作为PHP扩展载入,就可以通过简单的设置,来得到脚本编译的结果了。

1. 安装VLD

下载地址:http://pecl.php.net/package/vld

windows直接下载dll拷贝到php的ext目录中,然后在php.ini中加上extension=php_vld.dll就可以了。

Linux下载编译安装,然后同样php.ini加上extension=vld.so即可。

2. 使用VLD

php -dvld.active=1 test.php

比如上面的代码,就可以得到:

1eb5dc160714713df1c07ad2712d5460.png

PHP构建在Zend 引擎之上。PHP的opcode就是Zend虚拟机中的指令,在PHP源码({PHPSRC}/Zend/zend_vm_opcodes.c)中可以发现,一共有187条指令。顺便说一下,目前PHP源码托管到github上了,源码地址:https://github.com/php/php-src/

在PHP7之前的源码中,opcode({PHPSRC}/Zend/zend_compile.h)是这样的:

struct _zend_op {

opcode_handler_t handler; // 执行该opcode时调用的处理函数

znode result;

znode op1;

znode op2;

ulong extended_value;

uint lineno;

zend_uchar opcode;  // opcode代码

};

最新的PHP7中的是这样,可以看到增加了三个字段,表示操作数的数据类型,这大概是为PHP7可以支持强类型修改的吧(猜的)。

struct _zend_op {

const void *handler;

znode_op op1;

znode_op op2;

znode_op result;

uint32_t extended_value;

uint32_t lineno;

zend_uchar opcode;

zend_uchar op1_type;

zend_uchar op2_type;

zend_uchar result_type;

};

各个字段的含义:

(1)handler:op的执行句柄。

(2)op1, op2, result:这三个字段是op的操作数和操作结果载体,当然并不是每个op都需要使用这三个字段,根据op的功能不同,会使用其中某些字段。比如类型为ZEND_ECHO的op只需要使用op1,功能就是将op1中的相应的值输出。

void zend_do_echo(const znode *arg TSRMLS_DC) {

zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);

opline->opcode = ZEND_ECHO;

opline->op1 = *arg;

SET_UNUSED(opline->op2);

}

PHP7之前的代码是znode类型,而php7中是znode_op类型。

PHP7中znode_op和znode的定义:

typedef union _znode_op {

uint32_t constant;

uint32_t var;

uint32_t num;

uint32_t opline_num; /* Needs to be signed */

#if ZEND_USE_ABS_JMP_ADDR

zend_op *jmp_addr;

#else

uint32_t jmp_offset;

#endif

#if ZEND_USE_ABS_CONST_ADDR

zval *zv;

#endif

} znode_op;

typedef struct _znode { /* used only during compilation */

zend_uchar op_type;

zend_uchar flag;

union {

znode_op op;

zval constant; /* replaced by literal/zv */

} u;

} znode;

PHP7之前版本znode:

typedef struct _znode {

int op_type;

union {

zval constant;

zend_uint var;

zend_uint opline_num; /*  Needs to be signed */

zend_op_array *op_array;

zend_op *jmp_addr;

struct {

zend_uint var;  /* dummy */

zend_uint type;

} EA;

} u;

} znode;

具体变化的原因由于并没有仔细的看源码,所以还不太明白,有空研究一下源码。

其中op_type这个int类型的字段定义操作数的类型,这些类型一共有五种:

#define IS_CONST    (1<<0)

#define IS_TMP_VAR  (1<<1)

#define IS_VAR      (1<<2)

#define IS_UNUSED   (1<<3)    /* Unused variable */

#define IS_CV       (1<<4)    /* Compiled variable */

IS_CONST:

表示常量,例如$a = 123; $b = “hello”;这些代码生成OP后,123和”hello”都是以常量类型操作数存在。

IS_TMP_VAR:表示临时变量,临时变量一般在前面加~来表示,这是一些OP执行过程中需要用到的中间变量,例如初始化一个数组的时候,就需要一个临时变量来暂时存储数组zval,然后将数组赋值给变量。

IS_VAR:一般意义上的变量,以$开发表示,此种变量本人目前研究的较少,暂不介绍

IS_UNUSED :暂时不介绍,从名字来看应该是标识为不使用

IS_CV:这种类型的操作数比较重要,此类型是在PHP后来的版本中(大概5.1)中才出现,CV的意思是compiled variable,即编译后的变量,变量都是保存在一个符号表中,这个符号表是一个哈希表,试想如果每次读写变量的时候都需要到哈希表中去检索,势必会对效率有一定的影响,因此在执行上下文环境中,会将一些编译期间生成的变量缓存起来,此过程以后再详细介绍。此类型操作数一般以!开头表示,比如变量$a=123;$b=”hello”这段代码,$a和$b对应的操作数可能就是!0和!1, 0和1相当于一个索引号,通过索引号从缓存中取得相应的值。

(3)opcode:与CPU的指令类似,有一个标示指令的opcode字段。此字段保存的整形值即为op的编号,用来区分不同的op类型,opcode的可取值都被定义成了宏,可以在{PHPSRC}/Zend/zend_vm_opcodes.h中看到这些宏的定义,类似如({PHPSRC}/Zend/zend_vm_opcodes.h):

#define ZEND_NOP 0

#define ZEND_ADD 1

#define ZEND_SUB 2

#define ZEND_MUL 3

#define ZEND_DIV 4

#define ZEND_MOD 5

#define ZEND_SL 6

#define ZEND_SR 7

#define ZEND_CONCAT 8

(4)lineno:对应PHP源码中的行号。

(5)extended_value:PHP不像汇编那么底层,在脚本实际执行的时候可能还需要其他更多的信息,保存在extended_value字段。

转载请注明出处fullstackdevel.com:SEAN是一只程序猿 » PHP之opcode及VLD使用


http://chatgpt.dhexx.cn/article/Ckdr3bR0.shtml

相关文章

vld扩展

PHP代码的执行实际上是在执行代码解析后的各种opcode。通过vld扩展可以很方便地看到执行过程中的opcode。 一、安装vld扩展 git clone https://github.com/derickr/vld.git cd vld phpize ./configure --with-php-config/usr/local/php71/bin/php-config --enable-vld make &am…

vld使用

vld是一款免费的Visual C内存分析工具&#xff0c;下面来介绍一下怎么在qt中使用vld。 1.下载。去官网http://vld.codeplex.com/下载&#xff0c;我下的是2.5.1版本 2.安装。在安装目录下找到vld.lib文件。有32位和64位的注意位数。复制到qt安装目录的lib文件夹中 复制vld安装…

WINDOWS下内存泄漏检测工具VLD(Visual Leak Detector)的使用

VLD安装&#xff1a; https://kinddragon.github.io/vld/ 点击下载安装器 安装完成后&#xff0c;会自动将其include目录添加到VS的附加安装目录&#xff0c;将其静态库目录(lib目录)添加到VS的附加库目录&#xff0c; 无需手动添加include目录和lib目录 VLD使用&#xff1…

VLD(Visual LeakDetector)内存泄露库的使用

VLD简介 由于C/C语言没有所谓的垃圾收集器&#xff0c;内存的分配和释放都需要程序员自己来控制&#xff0c;这会给C/C程序员带来一定的困难。当您的程序越来越复杂时&#xff0c;它的内存管理也会变得越来越困难。内存泄漏、内存越界是最常见的内存问题之一。内存泄漏如果不是…

内存泄漏查找工具VLD的使用

1.什么是vld&#xff1f; Visual Leak Detector(VLD)同样是一款开源检测内存泄露软件的简称。 官方的介绍如下地址&#xff1a;在Visual Studio调试器下运行程序时&#xff0c;Visual Leak检测器将在调试会话结束时输出内存泄漏报告。泄漏报告包括完整的调用堆栈&#xff0c;显…

检查内存泄露的利器--VLD使用指南

1. VLD简介 Visual Leak Detector是一个免费的&#xff0c;强大的&#xff0c;开源的,可视化C 内存泄漏检测工具。 VLD容易使用。安装后&#xff0c;只需告诉Visual C 在哪里可以找到包含的头文件和库文件。然后&#xff0c;只需将以下行添加到代码中&#xff0c;即可将其与任…

内存泄露检测工具VLD(Visual Leak Detector)使用说明

目录 一、内存泄漏问题 二、VLD工具使用说明 1 下载VLD 2 安装VLD 3 使用VLD&#xff08;第一个种方法&#xff09; 3.1 附加头文件目录 3.2 附加库目录。 4 使用VLD&#xff08;第二个种方法&#xff09; 4.1 打包VLD_SDK 4.2 附加头文件目录 4.3 附加库目录。 5 …

【矩阵论】范数和矩阵函数(2)

范数及矩阵函数之收敛性与矩阵函数 定义矩阵的范数是为了讨论矩阵的收敛性。 注&#xff1a;范数和矩阵函数这个系列的&#xff08;1&#xff09;&#xff08;2&#xff09;等划分是按照章节来的&#xff0c;与视频的分集并不完全一致。 一. 收敛定理 1. 按坐标收敛 2. 按范数…

向量范数和矩阵范数的理解

向量范数 今天来聊一聊机器学习矩阵论的相关知识——范数&#xff08;Norm&#xff09;。 在学习机器学习基础算法的推导过程中&#xff0c;可以看到很多地方都应用到了这个范数。范数属于矩阵论的知识范围&#xff0c;可见数学基础的重要性。 机器学习的数学基础重点推荐—…

【矩阵论】范数和矩阵函数(1)

范数及矩阵函数之范数的概念 首先将本章的内容做以下大致的梳理&#xff1a; 我们通过范数的概念来解决矩阵函数的问题&#xff0c;利用矩阵的函数可以解决很多实际问题。 一. 概念与定义 1. 范数与赋范线性空间 &#xff08;1&#xff09;范数——向量空间上的满足某些性质…

矩阵范数与矩阵的模

矩阵范数&#xff08;matrix norm&#xff09;是数学中矩阵论、线性代数、泛函分析等领域中常见的基本概念&#xff0c;是将一定的矩阵空间建立为赋范向量空间时为矩阵装备的范数。应用中常将有限维赋范向量空间之间的映射以矩阵的形式表现&#xff0c;这时映射空间上装备的范数…

【数学】向量范数和矩阵范数(几种范数 norm 的简单介绍)

目录&索引 一、什么是范式&#xff1f;二、向量范式1-范数2-范数P-范数∞-范数-∞-范数 三、矩阵范式1-范数2-范数∞-范数F-范数 四、小结 一、什么是范式&#xff1f; 范数&#xff0c;是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域&#xff0c;范数是…

鬼畜视频制作必备——vegas pro特别版歌声合成工具UTAU

很好奇鬼畜是怎么做出来的&#xff1f;绝大部分up主用的必备的就是vegas&#xff0c;剪视频比较全能&#xff0c;比如&#xff1a;添加字幕、旋转视频、导入导出视频、导入导出视频等等&#xff0c;同时还提供了先进的悬停取消技术、高分辨率格式高达4K的音频素材以及支持4K UH…

平板电脑必装十大软件_知乎高赞回答:职场新人必装的电脑软件有哪些?太全了!...

本文首发于知乎,我觉得对大家很有帮助,因此同步了过来。 来源 :Tools指南知乎号 之前在微博上看到一篇文章,其中有一点让我很诧异:一个新入职的员工,不知道用什么软件打开rar压缩包。 但想到我刚入职场时,也是这个样子,马上就释然了。 但有一个新的问题出现了:刚入职场…

动态图册用HTML怎么制作,imgplay gif动图制作如何使用?imgplay图文使用教程

imgplay是一款利用图片、视频就能轻松制作GIF的应用软件。通过这款软件&#xff0c;大家可以切身感受拍照片和视频时的精彩瞬间&#xff0c;下面小编就为大家讲解imgplay软件的使用方法。 推荐下载&#xff1a; 软件名称&#xff1a;imgplay gif动图制作软件 3.0.1 官网安卓版软…

Filmigo视频剪辑VIP,这是一款多功能视频编辑、影片剪辑、图片美化、视频/音频制作 影音软件,功能强大!

《Filmigo视频剪辑》介绍&#xff1a;这是一款多功能视频编辑、影片剪辑、图片美化、视频/音频制作、配乐美颜影音软件&#xff0c;是一款简单易用的视频编辑、视频裁剪与视频剪辑工具&#xff0c;获得2018年google paly“娱乐奖项”应用APP&#xff1b;全球超过三千万视频剪辑…

视频编辑软件,哪款好?

过完了快快乐乐的圣诞节&#xff0c;拍了很多美美的照片&#xff0c;单独将照片一张一张放出来是不是显得太过于单调了&#xff0c;如果将美美的照片整合成一个美美的视频&#xff0c;那么是不是会吸粉更多呢&#xff1f;&#xff01; 要制作出一部画面精良的视频&#xff0c;…

android系统视频剪辑app推荐,知乎10w人收藏:玩短视频必装的9款剪辑App(最全)...

声明&#xff1a;本文来自于微信公众号 微果酱(ID&#xff1a;wjam123456)&#xff0c;作者&#xff1a; 橙子&#xff0c;授权站长之家转载发布。 做运营的 每天都要面临一些新难题 比如老板想追潮流做短视频 吐血写脚本、拍完视频 磨刀霍霍向猪羊准备剪视频 打开电脑剪辑软…

会声会影2022正式版一键式视频剪辑软件

多场景适用&#xff0c;会声会影2022适用于个人、商店或是企业&#xff0c;可满足vlog视频、影视混剪、游戏解说、电子相册制作、淘宝主图视频、企业宣传片、线上网课制作等需求!下载末尾会声会影教程参考! 基础剪辑&#xff0c;一应俱全 剪切 分割、删除、合并一气呵成&…

超全,短视频制作必备工具

都知道短视频是当下的热门领域&#xff0c;也有很多的普通人借助短视频平台走红&#xff0c;令人艳羡不已。那么&#xff0c;短视频到底怎么创作呢&#xff1f;下面就按照短视频的制作流程&#xff0c;给大家盘点一下超实用的那些工具&#xff1a; 01 选题——即时热榜 为什么…