Linux 进程的内存使用解析

Linux下如果知道一个进程究竟占用了多少内存?这是个经常被问道和被答错的问题。进程的内存分配是个比较复杂的话题,这里通过一个例子进行说明。

有这么一个简单程序:

[root@pczou pczou]# cat ./prog.c
#include <stdio.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

#define ONEM (1024*1024)

int func()
{
char s[16*ONEM];
char* p;
p = malloc(32*ONEM);
pause();
return 0;
}

int main()
{
printf("pid: %d\n", getpid());
func();
return 0;
}

其中func()这个函数分配了32MB的内存,以及16MB的堆栈。

运行一下,prog会停在pause()的位置,看看ps怎么说:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 4238 0.0 0.0 52396 352 pts/0 S 21:29 0:00 ./prog

VSZ指的是进程内存空间的大小,这里是52396KB;
RSS指的是驻留物理内存中的内存大小,这里是352KB。

一般系统管理员知道VSZ并不代表进程真正用到的内存,因为有些空间会仅在页表中挂个名,也就是说只是虚拟存在着,只有真正用到的时候内核才会把虚拟页面和真正的物理页面映射起来。比如,prog.c中用malloc()分配的32MB内存,由于程序中并没有用到这些内存,所以不应算到进程的帐上。

进程的内存使用情况比较复杂,这是因为:

        

  • 进程申请的内存不一定真正会被用到
  •     

  • 真正用到的内存也不一定是只有该进程自己在用 (比如动态共享库)
        

所以酒足饭饱结帐的时候,酒吧打出的帐单中不应该有没有上的菜,也不应该一个菜两份钱。而ps给出的就是这样的“糊涂”帐单,不足为凭。

算清楚帐的唯一办法是把每个菜都仔细过一遍,看看有没有上,有没有重复。下面的帐单要清楚多了:

Virtual memory : 52396 KB
Effective VM : 52120 KB
Mapped : 352 KB
Effective mapped: 76.6 KB
Sole use : 72 KB

Per file memory use
ld-2.3.4.so : VM 94208 B, M 90112 B, S 8192 B
prog : VM 8192 B, M 8192 B, S 8192 B
libc-2.3.4.so : VM 1180 KB, M 221184 B, S 16384 B

可以看出,虽然虚拟地址空间是52396KB,实际映射(a.k.a. 分配)的空间是352KB,这和ps给出的结果一致。再看"Effective Mapped"这个值,仅为76.6 KB。这个值的计算方法是:

有效的实际使用内存 = 该进程独占的内存 + 共享的内存A /共享A的进程数目 + 共享的内存B /共享B的进程数目 + …

虽然并不十分准确,但"Effective Mapped"已经足以说明进程所占用内存的实际大小了。

OK,最后用这个方法给所有进程都“结下帐”:

从上面的统计结果可以看出,

        

  • 虽然firefox的占用虚拟空间是最大的,但其实际占用的内存却比X Server要少。
  •     

  • firefox的实际占用的内存和其RSS (a.k.a. mapped)差别不大,只有少了约700;而kontact的实际占用的内存比起RSS足足少了约1.2MB。由此可以看出我用的窗口管理器是KDE而非Gnome,why? 因为Qt之类的共享库被很多KDE进程分担了。

linux下常见的性能分析工具介绍

工具介绍-vmstat
vmstat是个很全面的性能分析工具,能够观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下问转换、CPU使用等。系统性能分析工具中,我使用最多的是这个,除了 sysstat 工具包外,这个工具能查看的系统资源最多。

对于 Linux 的性能分析,100%理解 vmstat 输出内容的含义,那您对系统性能分析的能力就算是基本掌控了。

我这里主要说明一下这个命令显示出的部分数据代表的含义,和他反映出系统相关资源的状况。输出内容共有 6 类,分别说明如下。

Procs
r:
运行的和等待(CPU时间片)运行的进程数,这个值也能够判断是否需要增加CPU(长期大于1)
b:
处于不可中断状态的进程数,常见的情况是由IO引起的

Memory
swpd: 转换到交换内存上的内存(默认以KB为单位)
假如 swpd 的值不为0,或还比较大,比如超过100M了,但是 si, so 的值长期为 0,这种情况我们能够不用担心,不会影响系统性能。
free: 空闲的物理内存
buff: 作为buffer cache的内存,对块设备的读写进行缓冲
cache: 作为page cache的内存, 文档系统的cache
假如 cache 的值大的时候,说明cache住的文档数多,假如频繁访问到的文档都能被cache住,那么磁盘的读IO bi 会很小。

Swap
si: 交换内存使用,由磁盘调入内存
so: 交换内存使用,由内存调入磁盘
内存够用的时候,这2个值都是0,假如这2个值长期大于0时,系统性能会受到影响。磁盘IO和CPU资源都会被消耗。
我发现有些朋友看到空闲内存(free)很少或接近于0时,就认为内存不够用了,实际上不能光看这一点的,还要结合si,so,假如free很少,但是si,so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

Io
bi: 从块设备读入的数据总量(读磁盘) (KB/s),
bo: 写入到块设备的数据总理(写磁盘) (KB/s)
随机磁盘读写的时候,这2个 值越大(如超出1M),能看到CPU在IO等待的值也会越大

System
in: 每秒产生的中断次数
cs: 每秒产生的上下文转换次数
上面这2个值越大,会看到由内核消耗的CPU时间会越多

Cpu
us: 用户进程消耗的CPU时间百分比
us 的值比较高时,说明用户进程消耗的CPU时间多,但是假如长期超过50% 的使用,那么我们就该考虑优化程式算法或进行加速了(比如 PHP/Perl)
sy: 内核进程消耗的CPU时间百分比
sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。
wa: IO等待消耗的CPU时间百分比
wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。
id: CPU处在空闲状态时间百分比

情景分析
这个vmstat的输出那些信息值得关注?
Procs r: 运行的进程比较多,系统很繁忙
Io bo: 磁盘写的数据量稍大,假如是大文档的写,10M以内基本不用担心,假如是小文档写2M以内基本正常
Cpu us: 持续大于50,服务高峰期能够接受
Cpu wa: 稍微有些高
Cpu id:持续小于50,服务高峰期能够接受

///////////////////////
工具介绍-top

这个命令能够查看系统中运行的进程的状况,CPU使用状况,系统负载,内存使用等。他是检查系统进程运行状况最方便的工具了,他默认显示部分活动的进程,并且按照进程使用CPU的多少排序。他能够显示全部CPU的使用状况,也能够显示每个进程都运行在那个CPU上面。

我习惯使用这个命令查看那些进程或那类进程占用CPU和内存资源最多,以此迅速定位存在性能问题的进程,连同运行异常的进程。

用 top 看到的内存的说明(Mem的第2行)
actv
active 活跃的内存页,正在映射给进程使用
in_d
inactive_dirty 非活跃的内存页,并且内存数据被修改,需要写回磁盘
in_c
inactive_clean 非活跃的内存页,干净的数据,能够被重新分配使用
用 top 看到的进程所处的几种状态(STAT列)。
D 不可中断休眠,通常是 IO 操作所处的状态
R 正在执行的或处在等待执行的进程队列中
S 休眠中
T 暂停刮起的(比如Ctrl+Z),也可能是被 strace 命令调用中的状态
Z 僵尸进程,进程执行完成,但由于其父进程没有销毁该进程,而被init进程接管进行销毁。
W 没有使用物理内存,所占用的物理内存被转换到交换内存
高优先级的进程
N 低优先级

有时候一个进程会有多个状态的标志,比如SWN,SW

情景分析
前面两次top的输出那些信息值得关注?
图1)
Load average: 系统负载有降低的趋势,但仍然较高
Running: 有3个进程正在运行,正常,因为系统有4颗CPU
Cpu user: 接近200%了,有些大,服务高峰时能够接受
Cpu idle: 小于200%了,需要注意
图2)
Cpu iowait:接近200%了,很大

工具介绍-free
free命令显示系统内存的使用状况(物理内存和交换内存)
通过这个命令我们能够看到系统进程实际使用的物理内存,buffer和cache使用的物理内存

free命令输出的第二行(Mem)
这行分别显示了物理内存的总量(total)、已使用的(used)、空闲的(free)、共享的(shared)、buffer、cache的内存。

free命令输出的第三行(-/+ buffers/cache)
这行最容易让人迷惑。
他显示的第一个值(used这一列)是这样得来的:
Mem行used列 – Mem行buffers列 – Mem行cached列

他显示的第二个值(free这一列)是这样得来的:
Mem行free列 + Mem行buffers列 + Mem行cached列

free命令输出的第四行(Swap)
这行显示交换内存的总量、已使用量、空闲量

通常 buffer 和 cache 能够使用的内存空间越大,系统 IO 和 文档系统访问的性能越好。

工具介绍-uptime
最简便的查看系统负载的工具,系统负载越小,系统运行状况越好,对于系统负载处在什么范围内比较合适,我想是没有定论的,我介绍一下我的习惯。

我一般以15分钟负载的值来评估系统的健康度,以10为这个值的临界点,假如系统负载持续高于10,通常是存在某个资源长期紧张的原因,我们需要重视,并且得开始着手解决这个问题了。

假如偶尔高于10,应该开始留意他出现的频度,这往往是前面一种状况的先兆。

白话SSO

acegi内置了对CAS的支持。这里的CAS是3.0。建立CAS server是一个比较简单的事情。CAS server就是一个标准的war文件,把它发布就可以运行。需要做的仅仅是调整登陆和其他一些页面。先了解一下CAS如何实现SSO。
例子:原有系统A和系统B,现在在它们之间做SSO。
很显然,系统A和B都是CAS client。首先是访问系统A,干掉A的登陆页面,在A的入口判断有没有Ticket(票据),如果没有则重定向到CAS server,在CAS server提供Credential(大多数情况就是用户名和密码)。CAS server的作用非常简单:就是来验证用户密码。正确,则发送Ticket。CAS有5种Ticket,分别是TGC(通过cookie发送的 ticket),ST(Service Ticket),PGT,PGTIOU,PT。其中PGT,PGTIOU,PT属于代理ticket,这里不作讨论。具体可以参考
http://www.blogjava.net/openssl/archive/2006/04/26/SSO_CASProxy.html
TGC和ST的关系可以打个比方:
我去中央电视塔去玩,结果发现地下还有个海底世界。SSO前我是这么玩的:先去电视塔买张门票,玩完了;再去海底世界买张门票,玩完了。发现真累,两个景点这么近还要买两次门票,就不能搞个通票吗?于是就SSO。于是这样:我先去电视塔,门卫告诉我你不能进去要买票,于是把我送到通票售票处(CAS server)买票(登录),买吧,于是给了我两张票,注意,是两张,一张发到我手里,上面写着仅限电视塔使用(ST);靠,不是通票吗,咋仅限电视塔使用?别急,还有一张票(TGC)通过cookie发送你看不见。人家说了保证没问题,我咋办,这是人家的规矩,那就先去玩吧。出了电视塔我直扑海底世界,
门卫说要海底世界票,不会吧,我买的通票啊,门卫说不着急,又把我送回通票售票处(CAS server),通票售票处(CAS server)一看,发现我有TGC,嘿嘿,这家伙买过票了不用再买(不用再登录),于是换我一张票(ST)上面写着仅限海底世界使用,于是我就拿着这张票又去海底世界了。于是我明白了啥是SSO了,不就是把买票改成换票了吗?

PHP 判断内网的函数

大家知道,为了内网使用,ip地址中分被从A类、B类、C类网划分出一些地址供内网使用,后来工作中有个需求,需要判断ip是否是预留的ip地址,我也很懒,知道很有规律,但是就是不想自己写,就想到网上找个,但是翻破了互联网都没找见,一气之下就直接写了一个,同时也为互联网的更加强大添砖加瓦,以下是本人写的,仅供参考,如有不足之处(我相信肯定有的),烦请留言指教!

 

<?php
//判断内网的函数 

//Author :lijunjie 
//Mail :lijunjie1982@yahoo.com.cn 

function is_internal_ip($ip) { 
    
$ip ip2long($ip
); 
    
$a ip2long(‘10.0.0.0’); 
//A类网的预留ip 
    
$b ip2long(‘172.16.0.0’); 
//B类网的预留ip 
    
$c ip2long(‘192.168.0.0’); 
//C类网的预留ip 

    return ($ip $a) === $a || ($ip $b) === $b || ($ip $c) === $c); 
}
?>

上面写错了,应该利用掩码的概念来处理这个问题。

<?php
function is_internal_ip($ip) {
    
$ip ip2long($ip);
    
$net_a ip2long(‘10.255.255.255’) >> 24//A类网预留ip的网络地址
    
$net_b ip2long(‘172.31.255.255’) >> 20//B类网预留ip的网络地址
    
$net_c ip2long(‘192.168.255.255’) >> 16//C类网预留ip的网络地址

    return $ip >> 24 === $net_a || $ip >> 20 === $net_b || $ip >> 16 === $net_c;
}
?>

注:
ip地址中预留的内网ip地址如下:

A类: 10.0.0.0 ~ 10.255.255.255
B类: 172.16.0.0 ~ 172.31.255.255
C类: 192.168.0.0 ~ 192.168.255.255

二进制表示:

A类: 00001010 00000000 00000000 00000000 ~ 00001010 11111111 11111111 11111111
B类: 10101100 00010000 00000000 00000000 ~ 10101100 00011111 11111111 11111111
C类: 11000000 10101000 00000000 00000000 ~ 11000000 10101000 11111111 11111111

十进制的表示基本看不出规律,写成二进制就有规律了,注意红色的部分

下面看另外一个判断内网ip的写法:

<?php
function _isPrivate($ip) { 
    
$i explode(‘.’$ip); 
    if (
$i[0] == 10) return true
    if (
$i[0] == 172 && $i[1] > 15 && $i[1] < 32) return true
    if (
$i[0] == 192 && $i[1] == 168) return true
    return 
false

?>

 

判断ip是否属于某个子网的函数:

 <?php
/** 
 * isValidateIP 
 * 检查ip是否属于某个子网 
 * @param subnet:子网;如: 10.10.10/24 或 10.10.10.0/24 都是一样的 
 * @return true | false 
 */ 
function isValidateIP($subnet,$ip

    
$arr explode(‘/’,trim($subnet)); 
    if(
count($arr) == 1//支持单个ip的写法 
    

    return 
$ip == $arr[0]; 
    } 

    $long_ip ip2long(trim($ip)); 
    
$net ip2long($arr[0]); 
    
$hosts pow(2,32$arr[1]) – 1//主机部分最大值 
    
$host $net $long_ip//客户端ip的主机部分 

    return $host >= && $host <= $hosts
}
?>

WEB版的聊天工具

简介: web版的聊天工具就是免除了安装客户端的麻烦,如果你有很多聊天工具的帐号,那么安装msn qq ami google talk 等一大堆的聊天客户端是不是很麻烦,这里介绍几个web聊天工具的地址:

1. msn ami google talk
https://www.meebo.com/index-zh-CN.html

2. qq 自己的webqq 好像曾经是 webqq.qq.com 但是现在访问不了了

3. msn自己也有web版的:http://webmessenger.msn.com/default.aspx?mkt=zh-cn ,但是他自己做自己的都不如meebo.com 做的web版的msn漂亮

常用下载工具 lftp wget

下载工具

Linux 下的下载工具很多,字符界面的有lftp, wget,prozilla 等,图形界面有gftp,kget,d4x等。大部分文件在浏览器中查看和下载是最直接的。但也有一些情况使用浏览器就并不是很方便或者根本就不能用浏览器完成任务。

Windows的用户可能都熟悉leapftp,在Linux中Gftp同leapftp的功能能差不多,它支持FTP,HTTP,SSH和本地文件系统协议。但在Linux中最优秀的下载软件是字符界面的。这里我们推荐lftp和wget.用它们两个可以完成非常复杂的下载任务。

lftp
命令行语法
常用命令
相关文件
wget
wget的常见用法
wget各种选项分类列表
问题

lftp

lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常想一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。

 

命令行语法

要看lftp的命令行语法,只要在shell中输入lftp --help

如果在命令行中输入的站点名称,lftp将直接登录站点,比如

如果在命令行不输入站点名称,则必须在进入到lftp界面后用open命令打开

常用命令

        

  • 下载单个文件和一组文件,断点续传用-c参数         
  •     

  • 镜像(反镜像即上传)一个目录,可以用多个线程并行镜像一个目录(–parallel=N)         
  •     

  • 多线程下载,类似网络蚂蚁的功能;缺省是5个线程         
  •     

  • 后台任务管理

缺省情况下,按 Ctrl+z,正在执行的任务将转为后台执行,也可以 在命令行末尾加&符号使任务在后台执行。用jobs命令可以查看所 有的后台进程。用queue命令可以排队新的任务。如果退出lftp是

还有任务在后台执行,lftp将转为后台执行。

        

  • 其它用法

lftp支持类似bash的管道操作,例如用下面的命令可以将ftp服务 器上的特定目录下(也可以是整个站点)所有文件的大小存到本地的

文件ls.txt中

相关文件

/etc/lftp.conf
全局配置文件,实际位置依赖系统配置文件目录,可能在/etc,也可能在/usr/local/etc
~/.lftp/rc, ~/.lftprc
用户配置文件,将在/etc/lftp.conf之后执行,所以这里面的设置会覆盖/etc/lftp.conf中的设置。
lftp 缺省不会显示 ftp 服务器的欢迎信息和错误信息,这在很多时候不方便,因为你有可能想知道这个服务器到底是因为没开机连不上,还是连接数已满。如果是这样,你可以在 ~/.lftprc 里写入一行 就可以看到出错信息了。
更多的配置选项请查man手册或在lftp界面内用命令 set -a 获得。
~/.lftp/log
当lftp转为后台非挂起模式执行时,输出将重定向到这里
~/.lftp/bookmarks
这是lftp存储书签的地方,可以lftp查看bookmark命令
~/.lftp/cwd_history
这个文件用来存储访问过的站点的工作目录

wget

wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS 和FTP协议,可以使用HTTP代理.

 

所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统, wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作"递归下载"。在递归下载的时候,wget遵循Robot Exclusion标准(/robots.txt). wget 可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。

wget的常见用法

wget的使用格式

        

  • wget做站点镜像:

        

  • 在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载

上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。

 

        

  • 使用代理下载

代理可以在环境变量或wgetrc文件中设定

wget各种选项分类列表

        

  • 启动

        

  • 记录和输入文件

        

  • 下载

        

  • 目录

        

  • HTTP 选项

        

  • FTP 选项

        

  • 递归下载

        

  • 递归下载中的包含和不包含(accept/reject)

原文地址:http://dsec.pku.edu.cn/~yuhj/wiki/LftpWget.html

php:web编程界的巨无霸 目标直指java.net等大腕

草根出身的PHP语言挑战的对象是Java、.Net这样的大腕。
  Zeev这位30岁的以色列小伙子看起来一点也不像有权势的人物,可是他共同创始的PHP语言,却成为网络时代异军突起的一个传奇。最新的消息是,Sun公司已决定把免费公开Java源代码提上日程,而微软的脚本语言
ASP.net也只得一直实行免费赠送。这个小个子PHP及其同伙Linux、Apache、MySQL掀起的开放源代码浪潮影响了整个Web世界,给程序编写及发布方式带来了革命性的变化。重要的是,PHP两不耽误,一边保持着开源的真谛,另一边则取得了商业上的成功。
  就在最近,PHP商业化公司Zend又 获得了2000万美元的投资,投资人包括Intel Capital和SAP Ventures。IBM也将与Zend合作,把PHP引入到IBM的中级服务器平台,以支持访问DB2
数据库,这笔交易价值数百万美元。而Zend的下 一步很有可能是进行首次公开募股(IPO)。
  在今天,全球已有2000万个网站使用PHP,包括最流行的雅虎、Google、百度、YouTube、Digg,也包括像汉莎航空电子订票系 统、德意志银行的网上银行、华尔街在线的金融信息发布系统,甚至军队系统这类五花八门和苛刻的环境。PHP究竟是怎样炼成的?  
  源于草根
  作为目前全球最流行的网站应用软件编 程语言,PHP的成长历程和Linux有异曲同工之妙。1994年,它由Rasmus Lerdorf最早创建,Lerdorf只是想记录自己的在线简历,后来许多人都向他要程序的拷贝。1995年6月,Lerdorf在加入了一些介绍文档 之后,在Usenet新闻组发布出去,这就成了最早的PHP 1.0。
  这期间,两位大学生Zeev Suraski和Andi Gutmans需要能做一个基于Web的软件项目,需要能很好地支持Linux,但当时的
ASP并不完善,JSP又比较复杂,所以就选择了PHP。其后他们在工作中发现PHP还有些不足,便自愿加入PHP语言开发工作组,并重新编写了底层的解析引擎。1998年6月,有着历史意义的PHP 3.0发布,用户数开始飞涨。1999年,他们两人又创建了Zend公司,开发了Zend Engine,大大提高了PHP的性能。
  雅虎是PHP语言最早的使用者之一,随着雅虎的兴起,大量的站点开始学习雅虎背后的语言—PHP。此时,软件开始从传统模式向基于Web模式转变,几大势力一一长成:Linux
操作系统、Apache网络服务器、MySQL服务器,以及以PHP语言为代表的“P”族语言(PHP、Perl、Python),一本德国计算机杂志把它们共同称为LAMP(明 灯),也由此与J2EE架构(以Java为编程语言,Sun公司主导)、.Net架构(微软公司主导)形成了三足鼎立之势。在Evans Data公司的一份统计资料中,PHP使用者比Java及.Net的使用者稍有差距,但预计2007年的增长率将达37%,超过Java的16%和. Net的27%,这场草原上燃烧的星火正越来越旺。  
  从革命者到务实者
  PHP成功的两大秘诀,第一条就是简单。PHP简单到让喜欢卖弄技巧的程序员感到羞愧,但让那些渴望进入Web开发领域的初学者欣喜若狂。PHP像是一条鲶鱼,与
XML、Web Services融合无间。即使历次的版本升级,也无需担心PHP会丧失这种简单的特性。无疑,这个特点给需要快速开发、交互应用的Web2.0潮流极大的带来了方便,有超过半数的Ajax-enabled和Web2.0站点都选择了PHP。
  PHP的第二个秘诀,就是“Community(强大的社区)”。Discuz!软件的开发者,25岁的康盛创想公司CEO戴志康就是这个特性 的受益者。他说,不像其他的开发者需要从零开始,大量的PHP程序都有开放源代码可供学习,后人站在前人的肩膀上加以改进,又将这种知识积累的结果回馈给 社区。这曾被比喻为“大教堂和集市”,在集市中,知识得到了最大化的利用,效率提高、错误减少、成本降低。而大教堂只能越垒越高,不断延迟发布时间。
  现在,全球已有450万名PHP开发工程师,被称为“PHPer”,他们成为了软件世界中最有影响力的社区之一。有趣的是,开源的浪潮经过数年的发展,早已经走向庙堂,无论是Intel、IBM、
Oracle,甚至是微软,都成为鼓吹甚至主导开源的力量。11月初,微软与Zend公司达成了一项长期合作的伙伴关系,共同推动PHP语言的发展。
  与其说开源运动是个颠覆者,不如说更像是粘合剂。中国开源软件推进联盟主席陆首群说,LAMP也可以派生出WAMP(W代表Windows)。 事实上,PHP与.Net是并存的,PHP也可以和Windows捆绑在一起,两者并没有冲突,可以因地致宜地使用开源与闭源混合架构(Mix)。
  目前PHP社群和Zend公司的目标,是将PHP推广到企业级应用。在这一点上,欧洲和北美远远领先于中国。Zend(中国)技术支持中心总监耿志军说,PHP已经在金融、政府、交通、电信、媒介、娱乐等各大行业被广泛使用,完全脱离了一个简单网络语言开发工具的境界。而在中国, PHP只应用于门户网站和部分的专业网站,严谨的政府和金融网站难以看到它的身影。
  即便如此,PHP正在崛起,这一点毫无疑问。正如Red Hat推动了Linux的发展,Zend也正努力将PHP带入黄金时代。Zend于2005年在慕尼黑新开设了一家子公司;今年在法国也将设立一个子公 司;在中国,Zend公司与康盛创想公司建立了合作关系,并成立了Zend(中国)技术支持中心。有很多像耿志军这样的年轻人正加入到这个队伍中,这些围 绕着PHP的力量和这个语言本身一样充满了朝气。   
  PHP是一个简单而有生命力的语言
  —专访PHP语言创始人之一Zeev Suraski
  2006年10月23日,作为PHP语言核心缔造者之一的Zeev首次来到中国,本刊记者对他进行了独家专访。
  《互联网周刊》:随着PHP版本的升级,软件包会不会越来越复杂,以致偏离它的原始设计目标?
  Zeev(Zend公司创始人、CTO、PHP的创始人之一):这个问题确实有可能存在,但我们一直在尽量避免。十年前,当我和Andi Gutmans进行PHP开发时,就已经非常注意保持简洁这个核心要素。比如说,PHP 5就比PHP 4更为简化。当然我们会支持一些新的技术,但简单是我们最根本的一个特点。
  《互联网周刊》:我们知道商业公司的决策人会是董事会或CEO,但在像PHP这样的开源社区里,重大决策是如何形成的?
  Zeev:做决策时我们有一个社区的基础,并不是由1个人拍板就能决定的。有一个大概20人的团队,都可以对决策过程施加影响,包括我,包括 Andi Gutmans,还有一些研发人员。通常我们会对讨论的问题有一个共识,在此基础上再进行决策。但如果没有共识,就会有一些麻烦了,讨论的时间也会比较 长。经过10年的发展,我们基本形成了一套机制。不过在决策方面,我们的确会比一般的商业公司占用的时间要长一些。
  《互联网周刊》:这样会不会出现一个问题,PHP会不停的有补丁释出,导致软件的发布时间被拖长,比如从PHP 5到PHP 6。
  Zeev:你说的这种情况有时的确会发生。但是我们有一个底线,就是尽早确定一些最主要的特征。比如PHP 6中的Unicode特性。我们会定义一个目标,就是这个产品本身必须是高质量的,即使发布拖的时间比较长,但总体能保证它是一个好产品。
  《互联网周刊》:许多公司因为PHP的使用而受益并且发了大财,但语言和体系的创始人却往往不是最富有的,比如Java的创始人、Linux的创始人。你对金钱怎么看待?
  Zeev:未来总是不可预测的。目前虽然我不是百万富翁或亿万富翁,但是我对生活非常满意,而且非常喜欢。
  我首先是为Zend公司工作。Zend已经价值数亿美元,但我们的主要目标还是推进PHP语言的发展。当然我们仍是一个公司,而不是一个非盈利 性的组织,但我们的关注点并不只是赚钱。如果有一个公司对我们说,我们想收购你或想和你合作,我们不会立刻就说同意。因为我们看重的不光是钱,关键是要看 我们是不是有共同的目标,能够推进PHP语言的发展。