2013年12月

编译php5.3.28时的一个小问题

今天在编译php5.3.28的时候出现了一个小问题,如下:

/usr/local/src/php-5.3.28/Zend/zend_language_parser.h:317: 错误:与'zendparse'类型冲突

/usr/local/src/php5.3.28/Zend/zend_globals_macros.h:35: 附注:'zendparse'的上一个声明在此

make:*[ext/standard/basic_functions.lo] 错误 1

本来编译的过程一帆风顺,结果在make的时候出了上面的这个问题。

分别打开这两个文件,发现:

在zend_language_parser.h:317

int zendparse (void);

在zend_globals_macros.h:35

int zendparse(void *compiler_globals);

错误就是参数不一致导致的:

把zend_language_parser.h:317的int zendparse (void)改成int zendparse(void *compiler_globals),再次make,搞定!

host-only虚拟机不能ping通主机

  很多时候,我们需要一个Linux的环境来做开发,以达到开发环境和生产环境的相似,但是我们又不想抛弃习惯的Windows,也不习惯去切换Linux双系统,那么,虚拟机就是一个很好的选择。

  虚拟机的网络连接方式大体有3种,分别是:桥接模式(Bridged)、主机模式(host-only)、网络地址转换模式(NAT)。下面简单的介绍一下这3种连接模式的区别:

  桥接模式:

  在这种模式下,虚拟系统就像是局域网中的一台独立的主机,与宿主计算机平等的存在于网络中,你必须像对待局域网中的其他真正的机子一样来对待它(比如分配你的局域网所要求的网络地址、子网掩码、网关等)。使用bridged模式的虚拟系统和宿主机器的关系:就像连接在同一个Hub上的两台电脑。虚拟系统与宿主计算机以及宿主计算机所在网络的其他计算机都可以相互访问。如果你想利用VMWare在局域网内新建一个虚拟服务器,为局域网用户提供网络服务,就应该选择桥接模式。

  网络地址转换模式:

  如果你希望你的虚拟系统连接外部网络,这种模式最简单,虚拟系统不用做任何网络设置就可以访问外部网络。使用NAT模式的虚拟系统和宿主计算机的关系:宿主计算机就相当于是开启了DHCP功能的路由器,虚拟系统就是内网中的一台实际的机器,通过路由器的DHCP服务获得网络参数。虚拟系统可以访问宿主计算机所在网络的其他计算机(反之不行),可以与宿主计算机互访。

  主机模式:

  默认情况下,虚拟系统只能与宿主计算机互访,这也是Host-only的名字的意义。此时相当于两台机器通过双绞线直连。如果你想利用VMWare创建一个与网内其他机器相隔离的虚拟系统,进行某些特殊的网络调试工作,可以选择Host-only模式。

  在这里着重介绍Host-only模式,这个模式中,主机可以和虚拟机通信,虚拟机也可以和主机通信,虚拟机也可以和外界网络通信。首先我们首先要开启网络共享,比如我们现在用网线或者无线连着互联网,那么我们打开活动的网络适配器属性,设置共享到Host-only适配器,然后Host-only会自动把ip设置为192.168.2.1,这时主机就相当于一个网关了。我们在虚拟机中,把ip配置为192.168.2.2,网关设置为192.168.2.1就会发现虚拟机可以ping通baidu.com了,同时我们也可以用主机ping通虚拟机的192.168.2.2,但是当我们在虚拟机中ping主机192.168.2.1时会发现根本ping不通。原因在哪里呢?其实原因在于主机的防火墙规则里面,在Windows的防火墙的高级属性里面,将ICMPV4 in规则启用即可。现在我们就发现虚拟机也可以ping通主机了,大功告成,我们就可以就像远程连接似的随意连接本地的linux系统了。

使用PHP VLD扩展查看opcode

  在php的开发中,我们时常需要查看这段php代码运行的效率怎么样?而效率又和这段php代码被解析成了多少行opcode直接相关,所以,在这里推荐一款查看php生成opcode的扩展---VLD(Vulcan Logic Disassembler)。

  先来看官方的描述,http://pecl.php.net/package/vld,The Vulcan Logic Disassembler hooks into the Zend Engine and dumps all the opcodes (execution units) of a script. 意思就是在Zend引擎中,以挂钩的方式实现的用于输出PHP脚本生成的中间代码(执行单元)的扩展。

  首先,需要下载并安装这个扩展,linux下请下载tgz源代码包编译安装,windows下请在http://pecl.php.net/package/vld/0.12.0/windows下载相应的dll文件

  怎么使用呢?举一个例子。

test.php
<?php
    $arr = array(1,2,3,4,5);
    print_r($arr);

  然后我们在命令行或终端里执行  

> php -dvld.active=1 test.php

  然后就能输出类似的结果
opcode.png
这就是一张opcode图,我们能看到这段php代码被解析的流程。
抛砖引玉,更加高级的用法请google之。