<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; 中间代码</title>
	<atom:link href="https://www.phppan.com/tag/%e4%b8%ad%e9%97%b4%e4%bb%a3%e7%a0%81/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 04 Apr 2026 01:19:58 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>VLD扩展使用指南</title>
		<link>https://www.phppan.com/2011/05/vld-extension/</link>
		<comments>https://www.phppan.com/2011/05/vld-extension/#comments</comments>
		<pubDate>Tue, 03 May 2011 01:09:39 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[VLD]]></category>
		<category><![CDATA[VLD扩展]]></category>
		<category><![CDATA[中间代码]]></category>
		<category><![CDATA[使用指南]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=1361</guid>
		<description><![CDATA[VLD(Vulcan Logic Dumper)是一个在Zend引擎中，以挂钩的方式实现的用于输出PHP脚本生 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-indent: 2em;"><a style="color: #1299da; text-decoration: underline;" href="http://pecl.php.net/package/vld/">VLD(Vulcan Logic Dumper)</a>是一个在Zend引擎中，以挂钩的方式实现的用于输出PHP脚本生成的中间代码（执行单元）的扩展。 它可以在一定程序上查看Zend引擎内部的一些实现原理，是我们学习PHP源码的必备良器。它的作者是<a style="color: #1299da; text-decoration: underline;" href="http://derickrethans.nl/projects.html">Derick Rethans</a>, 除了VLD扩展，我们常用的<a style="color: #1299da; text-decoration: underline;" href="http://xdebug.org/">XDebug扩展</a>的也有该牛人的身影。</p>
<p style="text-indent: 2em;">VLD扩展是一个开源的项目，在<a style="color: #1299da; text-decoration: underline;" href="http://pecl.php.net/package/vld/">这里</a>可以下载到最新的版本，虽然最新版本的更新也是一年前的事了。 作者没有提供编译好的扩展，Win下使用VC6.0编译生成dll文件，可以看我之前写过的一篇文章(<a style="color: #1299da; text-decoration: underline;" href="http://www.phppan.com/2009/09/use-vc6-create-vld-extend/">使用VC6.0生成VLD扩展</a>)。 *nix系统下直接configue,make,make install生成。如果遇到问题，请自行Google之。</p>
<p style="text-indent: 2em;">看一个简单的例子,假如存在t.php文件，其内容如下：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;"><span style="color: #6d9cbe;">$a</span> <span style="color: #e0882f;">=</span> <span style="color: #1299da;">10</span><span style="color: #e0882f;">;</span>
<a style="color: #1299da; text-decoration: none;" href="http://www.php.net/echo"><span style="color: #e2392d;">echo</span></a> <span style="color: #6d9cbe;">$a</span><span style="color: #e0882f;">;</span></pre>
<p style="text-indent: 2em;">在命令行下使用VLD扩展显示信息。</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">php -dvld.active=1 t.php</pre>
<p style="text-indent: 2em;">-dvld.active=1表示激活VLD扩展，使用VLD扩展输出中间代码，此命令在CMD中输出信息为：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">Branch analysis from position: 0
Return found
filename:       D:\work\xampp\xampp\php\t.php
function name:  (null)
number of ops:  5
compiled vars:  !0 = $a
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   2     0  &gt;   EXT_STMT
         1      ASSIGN                                                   !0, 10
   3     2      EXT_STMT
         3      ECHO                                                     !0
   4     4    &gt; RETURN                                                   1

branch: #  0; line:     2-    4; sop:     0; eop:     4
path #1: 0,
10</pre>
<p style="text-indent: 2em;">如上为VLD输出的PHP代码生成的中间代码的信息，说明如下：</p>
<ul>
<li>Branch analysis from position 这条信息多在分析数组时使用。</li>
<li>Return found 是否返回，这个基本上有都有。</li>
<li>filename 分析的文件名</li>
<li>function name 函数名，针对每个函数VLD都会生成一段如上的独立的信息，这里显示当前函数的名称</li>
<li>number of ops 生成的操作数</li>
<li>compiled vars 编译期间的变量，这些变量是在PHP5后添加的，它是一个缓存优化。这样的变量在PHP源码中以IS_CV标记。</li>
<li>op list 生成的中间代码的变量列表</li>
</ul>
<p style="text-indent: 2em;">使用-dvld.active参数输出的是VLD默认设置，如果想看更加详细的内容。可以使用-dvld.verbosity参数。</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">php -dvld.active=1 -dvld.verbosity=3 t.php</pre>
<p style="text-indent: 2em;">-dvld.verbosity=3或更大的值的效果都是一样的，它们是VLD在当前版本可以显示的最详细的信息了，包括各个中间代码的操作数等。显示结果如下：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">Finding entry points
Branch analysis from position: 0
Add 0
Add 1
Add 2
Add 3
Add 4
Return found
filename:       D:\work\xampp\xampp\php\t.php
function name:  (null)
number of ops:  5
compiled vars:  !0 = $a
line     # *  op                           fetch          ext  return  operands
--------------------------------------------------------------------------------
-
   2     0  &gt;   EXT_STMT                                          RES[  IS_UNUSED  ]         OP1[  IS_UNUSED  ] OP2[  IS_UNUSED  ]
         1      ASSIGN                                                    OP1[IS_CV !0 ] OP2[ ,  IS_CONST (0) 10 ]
   3     2      EXT_STMT                                          RES[  IS_UNUSED  ]         OP1[  IS_UNUSED  ] OP2[  IS_UNUSED  ]
         3      ECHO                                                      OP1[IS_CV !0 ]
         4    &gt; RETURN                                                    OP1[IS_CONST (0) 1 ]

branch: #  0; line:     2-    3; sop:     0; eop:     4
path #1: 0,
10</pre>
<p style="text-indent: 2em;">以上的信息与没有加-dvld.verbosity=3的输出相比，多了Add 字段，还有中间代码的操作数的类型，如IS_CV,IS_CONST等。 PHP代码中的$a = 10; 其中10的类型为IS_CONST, $a作为一个编译期间的一个缓存变量存在，其类型为IS_CV。</p>
<p style="text-indent: 2em;">如果我们只是想要看输出的中间代码，并不想执行这段PHP代码，可以使用-dvld.execute=0来禁用代码的执行。</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">php -dvld.active=1 -dvld.execute=0 t.php</pre>
<p style="text-indent: 2em;">运行这个命令，你会发现这与最开始的输出有一点点不同，它没有输出10。 除了直接在屏幕上输出以外，VLD扩展还支持输出.dot文件，如下的命令：</p>
<pre style="background-color: #333333; color: #ffffff; font: normal normal normal 13px/normal 'Bitstream Vera Sans Mono', 'DejaVu Sans Mono', 'Courier New', monospace; overflow-x: auto; overflow-y: auto; padding: 10px;">php -dvld.active=1 -dvld.save_dir='D:\tmp' -dvld.save_paths=1 -dvld.dump_paths=1 t.php</pre>
<p style="text-indent: 2em;">以上的命令的意思是将生成的中间代码的一些信息输出在D:/tmp/paths.dot文件中。 -dvld.save_dir指定文件输出的路径，-dvld.save_paths控制是否输出文件，-dvld.dump_paths控制输出的内容，现在只有0和1两种情况。 输出的文件名已经在程序中硬编码为paths.dot。这三个参数是相互依赖的关系，一般都会同时出现。</p>
<p style="text-indent: 2em;">总结一下，VLD扩展的参数列表：</p>
<ul>
<li>-dvld.active 是否在执行PHP时激活VLD挂钩，默认为0，表示禁用。可以使用-dvld.active=1启用。</li>
<li>-dvld.skip_prepend 是否跳过php.ini配置文件中<a style="color: #1299da; text-decoration: underline;" href="http://php.net/auto-prepend-file">auto_prepend_file</a>指定的文件， 默认为0，即不跳过包含的文件，显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件：-dvld.execute=0</li>
<li>-dvld.skip_append 是否跳过php.ini配置文件中<a style="color: #1299da; text-decoration: underline;" href="http://php.net/auto-append-file">auto_append_file</a>指定的文件， 默认为0，即不跳过包含的文件，显示这些包含的文件中的代码所生成的中间代码。此参数生效有一个前提条件：-dvld.execute=0</li>
<li>-dvld.execute 是否执行这段PHP脚本，默认值为1，表示执行。可以使用-dvld.execute=0，表示只显示中间代码，不执行生成的中间代码。</li>
<li>-dvld.format 是否以自定义的格式显示，默认为0，表示否。可以使用-dvld.format=1，表示以自己定义的格式显示。这里自定义的格式输出是以-dvld.col_sep指定的参数间隔</li>
<li>-dvld.col_sep 在-dvld.format参数启用时此函数才会有效，默认为 &#8220;\t&#8221;。</li>
<li>-dvld.verbosity 是否显示更详细的信息，默认为1，其值可以为0,1,2,3 其实比0小的也可以，只是效果和0一样，比如0.1之类，但是负数除外，负数和效果和3的效果一样 比3大的值也是可以的，只是效果和3一样。</li>
<li>-dvld.save_dir 指定文件输出的路径，默认路径为/tmp。</li>
<li>-dvld.save_paths 控制是否输出文件，默认为0，表示不输出文件</li>
<li>-dvld.dump_paths 控制输出的内容，现在只有0和1两种情况，默认为1,输出内容</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2011/05/vld-extension/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
