<?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; embed</title>
	<atom:link href="http://www.laruence.com/tag/embed/feed" rel="self" type="application/rss+xml" />
	<link>http://www.laruence.com</link>
	<description>PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 - 左手代码 右手诗</description>
	<lastBuildDate>Wed, 08 Feb 2012 05:12:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>使用PHP Embed SAPI实现Opcodes查看器</title>
		<link>http://www.laruence.com/2008/09/23/539.html</link>
		<comments>http://www.laruence.com/2008/09/23/539.html#comments</comments>
		<pubDate>Tue, 23 Sep 2008 08:58:09 +0000</pubDate>
		<dc:creator>雪候鸟</dc:creator>
				<category><![CDATA[PHP应用]]></category>
		<category><![CDATA[PHP源码分析]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SAPI]]></category>
		<category><![CDATA[Zend/PHP]]></category>

		<guid isPermaLink="false">http://www.laruence.com/?p=539</guid>
		<description><![CDATA[   PHP提供了一个Embed SAPI，也就是说，PHP容许你在C/C++语言中调用PHP/ZE提供的函数。本文就通过基于Embed SAPI实现一个PHP的opcodes查看器。
首先，下载PHP源码以供编译， 我现在使用的是PHP5.3 alpha2
进入源码目录：
<coolcode lang="shell" linenum="off">
 ./configure --enable-embed 
 ./make
 ./make install
</coolcode>
最后，记得要将生成的libphp5.so复制到运行时...]]></description>
			<content:encoded><![CDATA[<div class="copyright" >
<ul  style="padding-left:1em;font-size:85%;padding-left:1em;font-size:85%;">
<li>作者: <a href="http://www.laruence.com" >Laruence</a>(<a href="http://www.twitter.com/laruence"  target="meme"  title="Twitter" ><img src="/images/ico-twitter.png" /></a> <a href="http://t.sina.com/laruence"  target="meme"  title="新浪微博" ><img src="/images/ico-sina.png" /></a> <a href="http://fusion.google.com/add?feedurl=http://www.laruence.com/feed"  target="meme"  title="Google阅读器" ><img src="/images/ico-google.png" /></a> <a href="mailto:laruence@yahoo.com.cn"  target="meme"  title="邮件" ><img src="/images/ico-mail.png" /></a>)</li>
<li>本文地址: <a href="http://www.laruence.com/2008/09/23/539.html"  title="Permanet Link to 使用PHP Embed SAPI实现Opcodes查看器" >http://www.laruence.com/2008/09/23/539.html</a></li>
</li>
<li>转载请注明出处 </li>
</ul></div>
<p>   PHP提供了一个Embed SAPI，也就是说，PHP容许你在C/C++语言中调用PHP/ZE提供的函数。本文就通过基于Embed SAPI实现一个PHP的opcodes查看器。<br/>
首先，下载PHP源码以供编译， 我现在使用的是PHP5.3 alpha2<br/>
进入源码目录：</p>
<pre name="code"  class="sh_shell"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
 ./configure --enable-embed --with-config-file-scan-dir=/etc/php.d --with-mysql  --with-config-file-path=/etc/
 ./make
 ./make install
</pre>
<p>最后，记得要将生成的libphp5.so复制到运行时库的目录，我直接拷贝到了/lib/, 否则会在运行你自己的embed程序的时候报错：</p>
<pre name="code"  class="sh_shell"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
./embed: error while loading shared libraries: libphp5.so: cannot open shared object file: No such file or directory
</pre>
<p> 如果你对PHP的SAPI还不熟悉的话，我建议你看看我的这篇文章：<a href="http://www.laruence.com/2008/08/12/180.html" >深入理解Zend SAPIs(Zend SAPI Internals)</a><br/>
 这个时候，你就可以在你的C代码中，嵌入PHP脚本解析器了， 我的例子：</p>
<pre name="code"  class="sh_cpp"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
#include &quot;sapi/embed/php_embed.h&quot;

int main(int argc, char * argv[]){
    PHP_EMBED_START_BLOCK(argc,argv);
    char * script = &quot; print 'Hello World!';&quot;;
    zend_eval_string(script, NULL,
                                      &quot;Simple Hello World App&quot; TSRMLS_CC);
    PHP_EMBED_END_BLOCK();
    return 0;
}
 </pre>
<p> 然后就是要指明include path了，一个简单的Makefile</p>
<pre name="code"  class="sh_shell"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
CC = gcc
CFLAGS = -I/usr/local/include/php/ \
            -I/usr/local/include/php/main \
            -I/usr/local/include/php/Zend \
            -I/usr/local/include/php/TSRM \
            -Wall -g
LDFLAGS = -lstdc++ -L/usr/local/lib -lphp5
ALL:
    $(CC) -o embed embed.cpp $(CFLAGS) $(LDFLAGS)
</pre>
<p>编译成功以后， 运行，我们可以看到， stdout输出 Hello World！</p>
<p>基于这个，我们就可以很容易的实现一个类似于vld的Opcodes dumper：<br/>
首先我们定义opcode的转换函数（全部的opcodes可以查看Zend/zend_vm_opcodes.h）；</p>
<pre name="code"  class="sh_php"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
char *opname(zend_uchar opcode){
    switch(opcode) {
        case ZEND_NOP: return &quot;ZEND_NOP&quot;; break;
        case ZEND_ADD: return &quot;ZEND_ADD&quot;; break;
        case ZEND_SUB: return &quot;ZEND_SUB&quot;; break;
        case ZEND_MUL: return &quot;ZEND_MUL&quot;; break;
        case ZEND_DIV: return &quot;ZEND_DIV&quot;; break;
        case ZEND_MOD: return &quot;ZEND_MOD&quot;; break;
        case ZEND_SL: return &quot;ZEND_SL&quot;; break;
        case ZEND_SR: return &quot;ZEND_SR&quot;; break;
        case ZEND_CONCAT: return &quot;ZEND_CONCAT&quot;; break;
        case ZEND_BW_OR: return &quot;ZEND_BW_OR&quot;; break;
        case ZEND_BW_AND: return &quot;ZEND_BW_AND&quot;; break;
        case ZEND_BW_XOR: return &quot;ZEND_BW_XOR&quot;; break;
        case ZEND_BW_NOT: return &quot;ZEND_BW_NOT&quot;; break;
        /*...省略 ....*/
        default : return &quot;UNKNOW&quot;; break;
</pre>
<p> 然后定义zval和znode的输出函数：</p>
<pre name="code"  class="sh_cpp"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
 char *format_zval(zval *z)
{
    static char buffer[BUFFER_LEN];
    int len;

    switch(z-&gt;type) {
        case IS_NULL:
            return &quot;NULL&quot;;
        case IS_LONG:
        case IS_BOOL:
            snprintf(buffer, BUFFER_LEN, &quot;%d&quot;, z-&gt;value.lval);
            return buffer;
        case IS_DOUBLE:
            snprintf(buffer, BUFFER_LEN, &quot;%f&quot;, z-&gt;value.dval);
            return buffer;
        case IS_STRING:
            snprintf(buffer, BUFFER_LEN, &quot;\&quot;%s\&quot;&quot;, z-&gt;value.str.val);
            return buffer;
        case IS_ARRAY:
        case IS_OBJECT:
        case IS_RESOURCE:
        case IS_CONSTANT:
        case IS_CONSTANT_ARRAY:
            return &quot;&quot;;
        default:
            return &quot;unknown&quot;;
    }
}

char * format_znode(znode *n){
    static char buffer[BUFFER_LEN];

    switch (n-&gt;op_type) {
        case IS_CONST:
            return format_zval(&amp;n-&gt;u.constant);
            break;
        case IS_VAR:
            snprintf(buffer, BUFFER_LEN, &quot;$%d&quot;,  n-&gt;u.var/sizeof(temp_variable));
            return buffer;
            break;
        case IS_TMP_VAR:
            snprintf(buffer, BUFFER_LEN, &quot;~%d&quot;,  n-&gt;u.var/sizeof(temp_variable));
            return buffer;
            break;
        default:
            return &quot;&quot;;
            break;
    }
}
 </pre>
<p>然后定义op_array的输出函数：</p>
<pre name="code"  class="sh_cpp"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
void dump_op(zend_op *op, int num){
    printf(&quot;%5d  %5d %30s %040s %040s %040s\n&quot;, num, op-&gt;lineno,
            opname(op-&gt;opcode),
            format_znode(&amp;op-&gt;op1),
            format_znode(&amp;op-&gt;op2),
            format_znode(&amp;op-&gt;result)) ;
}

void dump_op_array(zend_op_array *op_array){
    if(op_array) {
        int i;
        printf(&quot;%5s  %5s %30s %040s %040s %040s\n&quot;, &quot;opnum&quot;, &quot;line&quot;, &quot;opcode&quot;, &quot;op1&quot;, &quot;op2&quot;, &quot;result&quot;);
        for(i = 0; i &lt; op_array-&gt;last; i++) {
            dump_op(&amp;op_array-&gt;opcodes[i], i);
        }
    }
}
</pre>
<p>最后，就是程序的主函数了：</p>
<pre name="code"  class="sh_cpp"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
int main(int argc, char **argv){
    zend_op_array *op_array;
    zend_file_handle file_handle;

    if(argc != 2) {
        printf(&quot;usage:  op_dumper &lt;script&gt;\n&quot;);
        return 1;
    }
    PHP_EMBED_START_BLOCK(argc,argv);
    printf(&quot;Script: %s\n&quot;, argv[1]);
    file_handle.filename = argv[1];
    file_handle.free_filename = 0;
    file_handle.type = ZEND_HANDLE_FILENAME;
    file_handle.opened_path = NULL;
    op_array =  zend_compile_file(&amp;file_handle, ZEND_INCLUDE TSRMLS_CC);
    if(!op_array) {
        printf(&quot;Error parsing script: %s\n&quot;, file_handle.filename);
        return 1;
    }
    dump_op_array(op_array);
    PHP_EMBED_END_BLOCK();
    return 0;
}
</pre>
<p>编译，运行测试脚本(sample.php):<br/>
sample.php:</p>
<pre name="code"  class="sh_php"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
   echo &quot;laruence&quot;;
</pre>
<p>命令：</p>
<pre name="code"  class="sh_shell"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
./opcodes_dumper  sample.php
</pre>
<p>得到输出结果(如果你对下面的结果很迷惑，那么建议你再看看我的这篇文章：<a href="http://www.laruence.com/2008/06/18/221.html" >深入理解PHP原理之Opcodes</a>）：</p>
<pre name="code"  class="sh_shell"  linenum="off"   style="background: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:Monacobackground: #333; color: #d9d9d9; border-left: 15px solid #c9c9c9; padding: 9px; font-size: 1em; overflow-x: auto;font-family:MonacoConsolasConsolasCourierCouriermonospace;monospace;">
Script: sample.php
opnum   line                         opcode                                      op1                                      op2                                   result
    0      2                      ZEND_ECHO                               &quot;laruence&quot;
    1      4                    ZEND_RETURN                                        1
</pre>
<p>呵呵，怎么样，是不是很好玩呢？<br/>
源码地址：<a href="http://code.google.com/p/opcodesdumper/" >http://code.google.com/p/opcodesdumper/</a><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_shell.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_shell.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_cpp.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_shell.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_php.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_cpp.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_cpp.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_cpp.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_php.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_shell.js" ></script><script type="text/javascript"  src="http://www.laruence.com/wp-content/plugins/shjs-syntax-hiliter/shjs/lang/sh_shell.js" ></script></p>
<hr/><h2>Comments</h2><ul  style="padding-left:1em;font-size:85%;padding-left:1em;font-size:85%;"><li><a href="http://www.laruence.com/2008/09/23/539.html" >2008/09/25</a>, <a href="http://www.surfchen.org"  rel="external nofollow"  class="url" >surfchen</a> writes: google code的svn里还没源代码呢</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2008/09/25</a>, <a href="http://www.laruence.com"  rel="external nofollow"  class="url" >雪候鸟</a> writes: svn: http://code.google.com/p/opcodesdumper/source/browse/#svn/trunk
放进去了</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2008/09/26</a>, snowrui writes: 学习消化中......</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2008/11/06</a>, Anonymous writes: fxgh</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2008/11/06</a>, Anonymous writes: 看不懂..菜啊</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/05/17</a>, <a href="http://hi.baidu.com/jackywdx"  rel="external nofollow"  class="url" >jackywdx</a> writes: 呵呵,终于看懂了.</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/09/08</a>, Leric writes: 连接时总是报一个错误:
opcodes_dumper.cpp:(.text+0x910): undefined reference to `php_embed_init'
opcodes_dumper.cpp:(.text+0x9e9): undefined reference to `php_embed_shutdown'
collect2: ld returned 1 exit status
make: *** [ALL] Error 1

没用C做过什么东西,也不知道该咋解决,还望博主指点迷津</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/09/08</a>, <a href="http://www.laruence.com"  rel="external nofollow"  class="url" >雪候鸟</a> writes: @leric 你需要用ZEND_API来修饰php_embed_init/shutdown. 符号可见性的问题.</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/10/02</a>, fybird writes: 我是在php_embed_init/shutdown 前加上了SAPI_SPI才通过的。ZEND_API不好使？不知道为什么</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/10/03</a>, <a href="http://www.laruence.com"  rel="external nofollow"  class="url" >雪候鸟</a> writes: 你是用的PHP5.3吧?
是5.3的一个bug</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/10/03</a>, fybird writes: 对,直接就下载了一个5.3 没想到有bug.</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/10/22</a>, ddouble writes: 到处找zend_api的资料，想把php解释器嵌入到c程序中，google上怎么也找不到。为啥zend网站上也没呢，还是完全没摸到门儿？

博主知道哪里有吗？zend api reference之类的文档，最好还有指南示例之类的文档。谢谢啦！</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/10/22</a>, <a href="http://www.laruence.com"  rel="external nofollow"  class="url" >雪候鸟</a> writes: @ddouble 文档工作做的不好...确实没有你想要的.</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/10/23</a>, ddouble writes: 现在已能够在c程序里嵌入php解释器，非常感谢，但还有几个问题不解，望赐教：

1.如何在嵌入的方式下指定自己的php.ini文件；
2.多个连续执行的 zend_eval_string之间无法延续变量作用域，所以前面的eval的变量，后面eval的语句中无法得到。</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/10/23</a>, <a href="http://www.laruence.com"  rel="external nofollow"  class="url" >雪候鸟</a> writes: 1. 编译的时候确定

2. 我不知道有什么办法, 或者你可以使用c的变量来做个中转. 在PHP_EMBED_START_BLOCK(argc,argv)中做为第二个参数的一部分传入, 通过SG(request_info).argv来访问.</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/11/23</a>, aaa110110 writes: 请问windows环境下面怎么得到opcode,以上代码怎么编译呢?</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/11/23</a>, qq347835460 writes: 替楼主回到楼上的:
下载vld扩展,用c++编译成dll,怎么编译,可以baidu之,或者自己研究,这个过程要下载php的源码包和二进制包(最好版本一致).
编译成了dll之后修改php.ini,加一行:
extension=vld.dll
像普通扩展一样加载这个扩展.调用vld的方法如下:
C:\Documents and Settings\Administrator.TEST1111&gt;php -dvld.active=1 d:\\1.php
Failed loading php_xdebug.dll
Branch analysis from position: 12647312
Return found
filename:       D:\1.php
function name:  (null)
number of ops:  4
compiled vars:  !0 = $a
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   2     0  ASSIGN                                                   !0, 1
   3     1  ECHO                                                     !0
   4     2  RETURN                                                   1
         3* ZEND_HANDLE_EXCEPTION

1</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2009/11/23</a>, qq347835460 writes: 补充一点,楼主的代码(svn: http://code.google.com/p/opcodesdumper/source/)在windows下面理论上是可以编译成exe的.但是windows下的php的Embed SAPI是不一样,windows下的php默认支持Embed SAPI,在二进制包的根目录下面有一个.
php5embed.lib到底干什么用的,情况不明.
楼主的代码编译的时候要在最前面加上以下两句,否则编译阶段就会出错.
#define ZEND_WIN32
#define PHP_WIN32
同样需要下载源码包,源码包里面才有sapi/embed/php_embed.h,同样需要设置vc的inlude目录,把php5embed.lib加到lib目录下后编译还是无法通过,链接的时候出错了,具体原因不清楚.如果编译成exe了,使用起来就更方便了...(^_^这只是一个构思,还没有成为事实.)</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2010/09/19</a>, <a href="http://www.yakecan.com/archives/460"  rel="external nofollow"  class="url" >(转)深入理解PHP原理之变量分离/引用(Variables Separation) &raquo; Creative Power</a> writes: [...] 使用PHP Embed SAPI实现Opcodes查看器 [...]</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2011/03/20</a>, <a href="http://www.w3hacker.com/?p=204"  rel="external nofollow"  class="url" >使用PHP Embed SAPI实现Opcodes查看器 | 万维网黑客联盟</a> writes: [...] 本文地址: http://www.laruence.com/2008/09/23/539.html [...]</li><li><a href="http://www.laruence.com/2008/09/23/539.html" >2012/01/01</a>, <a href="http://liangzhenjing@gmail.com"  rel="external nofollow"  class="url" >砖家</a> writes: 很通俗易懂。入门很好。

PS：这代码颜色配色不错，能分享一下吗</li></ul><hr/><small  style="font-size:85%;font-size:85%;">Copyright &copy; 2010 <a href="http://www.laruence.com"  target="_blank" >风雪之隅</a> 版权所有, 转载务必注明. 该Feed只供个人使用, 禁止未注明的转载或商业应用. 非法应用的, 一切法律后果自负. 如有问题, 可发E-mail至my at laruence.com.(Digital Fingerprint: 73540ba0a1738d7d07d4b6038d5615e2)</small><h2 class="related_post_title" >Related Posts:</h2><ul class="related_post"   style="padding-left:1em;font-size:85%;padding-left:1em;font-size:85%;"><li><a href="http://www.laruence.com/2008/08/12/180.html"  title="深入理解Zend SAPIs(Zend SAPI Internals)" >深入理解Zend SAPIs(Zend SAPI Internals)</a></li><li><a href="http://www.laruence.com/2009/12/26/1198.html"  title="深入理解PHP原理之变量生命期(一)" >深入理解PHP原理之变量生命期(一)</a></li><li><a href="http://www.laruence.com/2008/11/07/581.html"  title="PHP的GET/POST等大变量生成过程" >PHP的GET/POST等大变量生成过程</a></li><li><a href="http://www.laruence.com/2008/09/19/520.html"  title="深入理解PHP原理之变量分离/引用(Variables Separation)" >深入理解PHP原理之变量分离/引用(Variables Separation)</a></li><li><a href="http://www.laruence.com/2008/08/26/463.html"  title="深入理解PHP原理之变量作用域(Scope in PHP)" >深入理解PHP原理之变量作用域(Scope in PHP)</a></li><li><a href="http://www.laruence.com/2008/08/22/412.html"  title="深入理解PHP原理之变量(Variables inside PHP)" >深入理解PHP原理之变量(Variables inside PHP)</a></li><li><a href="http://www.laruence.com/2008/08/15/274.html"  title="PHP 源代码分析 V0.0.2" >PHP 源代码分析 V0.0.2</a></li><li><a href="http://www.laruence.com/2008/08/14/250.html"  title="实现PHP的编译执行分离(separating compilation and execution)" >实现PHP的编译执行分离(separating compilation and execution)</a></li><li><a href="http://www.laruence.com/2008/08/12/164.html"  title="深入理解PHP原理之函数(Introspecting PHP Function)" >深入理解PHP原理之函数(Introspecting PHP Function)</a></li><li><a href="http://www.laruence.com/2008/08/11/147.html"  title="深入浅出PHP(Exploring PHP)" >深入浅出PHP(Exploring PHP)</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.laruence.com/2008/09/23/539.html/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
	</channel>
</rss>

