PHP安装与使用VLD查看opcode代码【PHP安装第三方扩展的方法】
需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode
下载与安装VLD
# wget http://pecl.php.net/get/vld-0.11.2.tgz
# tar zxvf vld-0.11.2.tgz
# cd ./vld-0.11.2
# /usr/local/php/bin/phpize 或者直接phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld
# make && make install
---------------------------------
编辑php.ini文
php.ini位置
#cd /usr/local/php/lib
增加
extension=
重启Apache:
# /usr/local/apache2/bin/apachectl restart
---------------------------------
查看phpinfo()信息
--------------------------------
至此,VLD就安装完了。写个简单的test.php
$a='123';
echo $a;
# php -dvld.active=1 ./test.php
如果没有设置php环境变量的话
#/usr/local/php/bin/php -dvld.active=1 test.php
查看结果
如上为VLD输出的PHP代码生成的中间代码的信息,说明如下:
- Branch analysis from position 这条信息多在分析数组时使用。
- Return found 是否返回,这个基本上有都有。
- filename 分析的文件名
- function name 函数名,针对每个函数VLD都会生成一段如上的独立的信息,这里显示当前函数的名称
- number of ops 生成的操作数
- compiled vars 编译期间的变量,这些变量是在PHP5后添加的,它是一个缓存优化。这样的变量在PHP源码中以IS_CV标记。
- op list 生成的中间代码的变量列表
使用-dvld.active参数输出的是VLD默认设置,如果想看更加详细的内容。可以使用-dvld.verbosity参数。
#php -dvld.active=1 -dvld.verbosity=3 text.php
-dvld.verbosity=3是VLD在当前版本可以显示的最详细的信息.
如果我们只是想要看输出的中间代码,并不想执行这段PHP代码,可以使用-dvld.execute=0来禁用代码的执行
#php -dvld.active=1 -dvld.execute=0 text.php
VLD扩展的参数列表:
- -dvld.active 是否在执行PHP时激活VLD挂钩,默认为0,表示禁用。可以使用-dvld.active=1启用。
- -dvld.skip_prepend 是否跳过php.ini配置文件中auto_prepend_file指定的文件, 默认为0,即不跳过包含的文件,显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件:-dvld.execute=0
- -dvld.skip_append 是否跳过php.ini配置文件中auto_append_file指定的文件, 默认为0,即不跳过包含的文件,显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件:-dvld.execute=0
- -dvld.execute 是否执行这段PHP脚本,默认值为1,表示执行。可以使用-dvld.execute=0,表示只显示中间代码,不执行生成的中间代码。
- -dvld.format 是否以自定义的格式显示,默认为0,表示否。可以使用-dvld.format=1,表示以自己定义的格式显示。这里自定义的格式输出是以-dvld.col_sep指定的参数间隔
- -dvld.col_sep 在-dvld.format参数启用时此函数才会有效,默认为 “\t”。
- -dvld.verbosity 是否显示更详细的信息,默认为1,其值可以为0,1,2,3 其实比0小的也可以,只是效果和0一样,比如0.1之类,但是负数除外,负数和效果和3的效果一样 比3大的值也是可以的,只是效果和3一样。
- -dvld.save_dir 指定文件输出的路径,默认路径为/tmp。
- -dvld.save_paths 控制是否输出文件,默认为0,表示不输出文件
- -dvld.dump_paths 控制输出的内容,现在只有0和1两种情况,默认为1,输出内容
使用VLD比较代码差异
代码text1.php
$var = 111;
$str = "AAA " . $var . " BBB";
代码text2.php
$var = 111;
$str = "AAA $var BBB";

从结果很清晰的看出第一段代码比第二段代码多了concat
第一个连接操作,将“test string begin ”和$var连接起来,得到“AAA 111”,然后再执行第二个连接操作,将上一个操作得到的结果“AAA 111”和” BBB”连接起来,并将结果存储在另一个临时变量,最后将第二个连接操作的结果赋值给$str。
连接操作对应的opcode为ZEND_CONCAT,对于所给的两个操作数,其最终通过concat_function函数将两个字符串连接起来,如果所给的变量的类型不是字符串,则会通过zend_make_printable_zval将其转换成字符串。concat_function函数会根据两个字符串的长度重新分配内存,并执行两次拷贝操作,将两个字符串拷贝到新的内存空间。这里针对两个字符串相同的情况有一个特殊处理。
if (result==op1) { /* special case, perform operations on result */uint res_len = Z_STRLEN_P(op1) + Z_STRLEN_P(op2);Z_STRVAL_P(result) = erealloc(Z_STRVAL_P(result), res_len+1);memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(result), Z_STRVAL_P(op2), Z_STRLEN_P(op2));Z_STRVAL_P(result)[res_len]=0;Z_STRLEN_P(result) = res_len;
} else {Z_STRLEN_P(result) = Z_STRLEN_P(op1) + Z_STRLEN_P(op2);Z_STRVAL_P(result) = (char *) emalloc(Z_STRLEN_P(result) + 1);memcpy(Z_STRVAL_P(result), Z_STRVAL_P(op1), Z_STRLEN_P(op1));memcpy(Z_STRVAL_P(result)+Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2));Z_STRVAL_P(result)[Z_STRLEN_P(result)] = 0;Z_TYPE_P(result) = IS_STRING;
}
而直接在字符串中插入变量,其所有的操作都是添加操作,将字符串添加到返回值,将变量添加到返回值,
所有的结果返回都是在一个临时变量中,如我们的示例,首先会将”AAA “添加到临时变量,然后将临时变量和$var变量添加到临时变量,之后将临时变量和” BBB”添加到临时变量,最后将此此时变量赋值给$str。这里添加将字符串添加到临时变量,其对应的opcode为ZEND_ADD_STRING,将变量添加到临时变量,其对应的opcode为ZEND_ADD_VAR,虽然这两个操作的opcode不同,但其最终调用都是add_string_to_string,他们所不同的调用此函数的第三个参数,一个是操作码存储的ZVAL变量,一个是通过变更列表获取的ZVAL变量。
如果觉得需要看C语音级别的php源码,可以参考:使用strace查看C语言级别的php源码
如果你要查看memcpy可以去这个网站
http://linux.about.com/od/commands/l/blcmdl.htm
搜索结果在:http://linux.about.com/library/cmd/blcmdl3_memcpy.htm
========================
延伸阅读参考:
http://www.phppan.com/2011/05/vld-extension/
PHP中的字符串连接操作
http://blog.csdn.net/phpkernel/article/details/5718519
http://www.laruence.com/2008/08/19/338.html
相关文章:

实现数组字符串翻转的两种方法
//第一种方法:递归法 #include <stdio.h> int reverse_string(char * string) {if (*string ! \0){reverse_string(string1);printf("%c", *string);} } int main() {char *string "abcde";printf("源字符串为:%s\n&quo…

详解 Python 如何将爬取到的数据分别存储到 txt、excel、mysql 中!
作者 | 黄伟呢来源 | 数据分析与统计学之美1. 页面分析我爬取的页面是腾讯体育,链接如下:https://nba.stats.qq.com/player/list.htm观察上图:左边展示的分别是NBA的30支球队,右边就是每只球队对应球员的详细信息。此时思路就很清…

蹭了BCH热度,还来诋毁BCH,这些跳梁小丑到底在玩什么阴谋?
最近一些分叉币为了博眼球简直什么招数都用。有的某分叉币对主链暂停10天的问题闭口不提,靠微博撕逼来吸引关注,有的则自导自演了一出51%***的大戏。而奇怪的是当别人开始谈论他们这些错误的时候,他们却把矛头指向了火热的比特币现金。这些跳…

比 GPT-3 更擅长理解用户意图,OpenAI发布 InstructGPT
作者 | 青苹果来源 | 数据实战派近日,OpenAI 发布了一项令人瞩目的研究—— InstructGPT。在这项研究中,相比 GPT-3 而言,OpenAI 采用对齐研究(alignment research),训练出更真实、更无害,而且更…

The C10K problem原文翻译
原文地址:http://www.cnblogs.com/fll/archive/2008/05/17/1201540.htmlThe C10K problem如今的web服务器需要同时处理一万个以上的客户端了,难道不是吗?毕竟如今的网络是个big place了。 现在的计算机也很强大了,你只需要花大概$…

mysql中模糊查询的四种用法介绍
下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。 比如 SELECT * FROM [user] WHERE u_name LIKE …

spring data jpa 详解
2019独角兽企业重金招聘Python工程师标准>>> 本篇进行Spring-data-jpa的介绍,几乎涵盖该框架的所有方面,在日常的开发当中,基本上能满足所有需求。这里不讲解JPA和Spring-data-jpa单独使用,所有的内容都是在和Spring整…

php使用curl可以get 模拟post
本机windows测试需要打开curl php.ini extensionphp_curl.dll重启apacheinclude (Curl.php);$cunew QP_Curl_Curl();$s$cu->get(http://www.baidu.com);echo $s;Curl.php可以使用http://www.myquickphp.com/的框架中的组件Curl.php/*** CURL 工具* * category QuickPHP(II…

为什么使用模块?
# -*- coding: utf-8 -*- #python 27 #xiaodeng #模块01#每个文件都是一个模块,并且模块导入之后就可以导入模块定义的变量名。#为什么使用模块? #命名空间提供了将部件组织为系统的简单的方法。 #在一个模块文件的顶层定义的所有变量名都成了被导入的模…

报告!插件×元宵来啦
欢欢喜喜 闹元宵迈过新年,开工大吉,元宵节的脚步悄悄靠近,在大家努力搬砖得同时,CSDN插件带着它的元宵活动走来啦~元宵喜乐汇虎年的第一个月圆之夜,除了吃汤圆还能干啥呢?当然是猜灯谜咯!CSDN插…

%f%g%e区别
%f 表示按浮点数的格式输出 %e 表示按指数形式的浮点数的格式输出 %g 表示自动选择合适的表示法输出,可以去小数末尾多余的0转载于:https://www.cnblogs.com/holyday/p/9111777.html

Cassandra安装测试
说明,本人成功安装过程记录 只要看解压目录的readme.txt即可,其他网上教程由于版本不对会执行报错,例如遇到编码问题 #wget http://www.apache.org/dyn/closer.cgi?path/cassandra/1.0.3/apache-cassandra-1.0.3-bin.tar.gz #tar -zxvf a…

如何使用 Python 隐藏图像中的数据
作者 | 小白来源 | 小白学视觉隐写术是在任何文件中隐藏秘密数据的艺术。秘密数据可以是任何格式的数据,如文本甚至文件。简而言之,隐写术的主要目的是隐藏任何文件(通常是图像、音频或视频)中的预期信息,而不实际改变…

php 的 危 险 参 数
hpinfo() 功能描述:输出 PHP 环境信息以及相关的模块、WEB 环境等信息。 危险等级:中 passthru() 功能描述:允许执行一个外部程序并回显输出,类似于 exec()。 危险等级:高 exec() 功能描述:允许执行一个外部…

开源 | 蚂蚁金服分布式中间件开源第二弹:丰富微服务架构体系
小蚂蚁说: 数据、消息、微服务是蚂蚁金服自主研发的金融级分布式中间件 SOFA (Scalable Open Financial Architecture)的三大方向。 一个多月前,蚂蚁金服开源了 SOFABoot 和 SOFARPC 两个组件,受到了社区的热烈欢迎&am…

System.Web.Caching.Cache类 缓存 各种缓存依赖
原文:System.Web.Caching.Cache类 缓存 各种缓存依赖Cache类,是一个用于缓存常用信息的类。HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例。 一、属性 属性说明Count获取存储在缓存中的项数。EffectivePercentagePhysicalMemoryLimit获取在 ASP.NE…

Python 可视化近 90 天的百度搜索指数 + 词云图
作者 | 叶庭云来源 | AI庭云君一、简介 在实际业务中我们可能会使用爬虫根据关键词获取百度搜索指数历史数据,然后进行对应的数据分析。百度指数,体验大数据之美。但要获取百度指数相关的数据,困难如下:不是静态网页,并…

php常用比较函数区别表
php常用比较函数区别表 表达式 empty() is_null() isset() if($x) $x "" TRUE FALSE TRUE FALSE $x null TRUE TRUE FALSE FALSE $x is undefined TRUE TRUE FALSE FALSE(报E_NOTICE错) $x array() TRUE FALSE TRUE FALSE $x false TRUE FALSE TRUE FALSE $x 0 …

实战分享:淘宝Web 3D应用与游戏开发
大家下午好!我们今天讲个比较有意思的话题,这个话题在业界被谈及得比较少。大家在座有做过移动端开发的同学吗?请举个手,人还挺多的。那做过3D应用的同学请举个手,有用过Threejs的请举个手,做过游戏的呢..人…

常见NoSQL系统使用场景分析
•Cassandra •特性:分布式与复制的权衡\根据列和键范围进行查询\BigTable类似的功能:列,列族\写比读快很多 •最佳适用:写操作较多,读比较少的时候。如果你的系统都是基于Java的时候。 •应用场景:银行&am…

再一次输给了AI,弯道急速超车、登上 Nature 封面
作者 | 学术头条来源 | 学术头条人工智能(AI)的很多潜在应用,涉及与人类交互时做出更优化的实时决策,而竞技或者博弈类游戏,便是最佳的展示舞台。近日,发表在《自然》杂志上的封面文章报告称,AI…

maven 多环境打包
2019独角兽企业重金招聘Python工程师标准>>> 1.在项目的pom中添加 <build><resources><!-- Resource Filter --><resource><directory>src/main/resources</directory><filtering>true</filtering></resource&g…

Sass函数:Sass Maps的函数-map-has-key($map,$key)
map-has-key($map,$key) 函数将返回一个布尔值。当 $map 中有这个 $key,则函数返回 true,否则返回 false。 前面的示例,当 $key 不在 $map 中时,使用 map-get($map,$key) 函数将返回一个 null 值。但对于开发人员,并看…
Memcache内存分配策略
转自:http://tank.blogs.tkiicpp.com/2010/12/14/memcache%e5%86%85%e5%ad%98%e5%88%86%e9%85%8d%e7%ad%96%e7%95%a5/ 一、Memcache内存分配机制关于这个机制网上有很多解释的,我个人的总结如下。 Page为内存分配的最小单位。 Memcached的内存分配以page…

论排列组合,持续更新
今天刚好碰到了一个排列组合问题,因为之前对这方面的学习比较少,所以用的非常蠢的方法做了四位数中取三位的排列,写的程序太有局限性,源码如下#define _CRT_SECURE_NO_WORNINGS 1#include<stdio.h>#include<stdlib.h>…

Python 中少为人知的 10 个安全陷阱
作者:Dennis Brinkrolf译者:豌豆花下猫Python猫原题:10 Unknown Security Pitfalls for Python英文:https://blog.sonarsource.com/10-unknown-security-pitfalls-for-pythonPython 开发者们在使用标准库和通用框架时,…
JS+CSS3 360度全景图插件 - Watch3D.js
日常闲扯 从上一篇文章到这篇中间快过了一年了,时间真滴过得快。不是在下中间没想过写新的文章,而是自己确实变懒了(体重1 1 1 1....) 。。OTL。。。不过到最后觉得还是需要写点东西,不然人就真废了,于是便有了这样一个插件&#…

CQRS学习——最小单元的Cqrs(CommandEvent)[其一]
【说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明。】 结构 在学习和实现CQRS的过程中,首要参考的项目是这个【http://www.cnblogs.com/yangecnu/p/Introduction-CQRS.html】。所以Dpfb…

PHP APC安装与使用
最简单的方法,找到php安装目录的pecl 自动安装: # /usr/local/php/bin/pecl install apc 下面按提示一步步完成即可 配置/etc/php.ini 末尾加入extensionapc.so 手动安装: 官网 http://cn2.php.net/manual/zh/book.apc.php 下载http://p…

AIphaCode 并不能取代程序员,而是开发者的工具
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) DeepMind 是 AI 研究实验室,它引入了一种深度学习模型,可以生成具有显著效果的软件源代码。该模型名为 AIphaCode,是基于 Transformers,OpenAI 在其代码生…