支持中文的sphinder 修改版

[不好意思写标题时走神了。。。。。是sphider,不是sphinx.sphider是一个php写的实现抓取和站内搜索的工具。]
这两天想在内部代码开发规范和流程上发一下力,于是选了个基于web的项目管理redmine,搭了起来。同时,还想提供一个PHP文档的在线生成和搜索站点,于是找到了sphider.但是sphider对中文支持很不好,于是我做了一点点hack.

下载地址
安装请按照官方说明来。我是按UTF-8来处理的。目前是单字,对于PHP文档搜索这个特定应用场景来说,足够了。

nginx在fastcgi模块中转发真实的后端IP

网上流传着一份nginx fastcgi_params,大家在nginx下用fastcgi跑PHP大多用的是这个版本,但是这个版本有2个问题,1是默认的buffersize太小,php一旦输出比较多的error_log就挂了,2是没有转发HTTP_X_FORWARD_FOR和HTTP_CLIENT_IP这两个变量.我的服务器是在lighttpd后面跑的nginx+php,wordpress收不到正确的IP,于是垃圾评论无法正常工作.现在我改了一份更合用的版本,提供出来.
fastcgi_buffers 8 128k;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;
fastcgi_param HTTP_CLIENT_IP $http_client_ip;

# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

fastcgi_buffer_size 256k;
#fastcgi_buffers 4 256k;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
#fastcgi_read_timeout 300;

fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

稍显寒酸的一个PHP框架:supermin

我曾经很长时间不搞什么PHP框架(框架神马的最讨人厌鸟)
我身边很多哥们,都是PHP大牛,所以,每人都写了自己的PHP框架,所以,其实我用不管谁的框架看上去都挺得罪人的,嗯,于是我只能是啥框架也不用了.
不过前一阵团队某个人自己引入了一个框架,然后做完了一个项目,接下来就拍拍屁股走人鸟~~
于是我总结了几个规律,我称之为徐氏定律:

如果一个项目只有一个人全盘负责,这个人一定会离职;
如果一个项目你不盯着,一定会出问题;
如果让一个人自己负责一个东西,不搞个需求评审过一下,他肯定会假想一堆需求;
如果一个程序员去设计一个框架,他肯定想着跨平台,多引擎支持,肯定想着做到老少咸宜男女通吃.

于是我决定写一个真正够用的好用的框架,在公司内部强行推介一下,你可以不用框架,但是如果你要用的话必须用我的框架;没有经过一大堆同事的评审和我的许可,你不可以使用自己写的框架,尤其是,我们基本没有工夫让谁写个牛B的框架….
嗯,于是回家我就开始搞,用了两个晚上,加起来一共不到20个小时的时间,我的超小精框架出厂了,我一向猥琐,嗯,也给起了个猥琐的名字:SM.嗯,全称是:supermini. 几百行代码而已,但是我觉得已经够用了,主要封装两个东西,一个是数据库访问,可以帮您连数据库和拼凑sql语句,另一个东西是一个Form表单生成工具.
这是一个很有特色的框架,嗯,其实连框架都称不上,就一个600来行的小lib而已,都还没有在生产环境上进行过实验,所以暂时不放代码出来.不过这个小框架包含了我对PHP的理解,嗯,每一种框架都是作者的程序哲学的体现.先来个PPT介绍一下基本逻辑.这个PPT是HTML5做的,请用chrome观看.
详情请参见:”迷你PHP框架supermini简介”.

检测文本正文是否包含有特定词的PHP扩展

项目主页为:http://github.com/xurenlu/acfilter

1:acfilter 用于实现查询某段文本中是否含有指定的词(当前禁词越来越多的情况下,
是有必要开发一个扩展来干这个了):在词库够大的情况下,能实现一定的分词的功能;
2:acfilter 基于发布于http://code.google.com/p/pysoft/ 上的acseg完成,原有代码发布的license为New BSD license;
acfilter 仍使用New BSD lincense;
3:
安装:

tar -xzf acfilter.tar.gz
cd acfilter
phpize
./configure
make
sudo make install

安装完之后请在php.ini里加上:

extension=acfilter.so

4:使用:
示例代码:

$ac=acfilter_new();
var_dump($ac);
acfilter_add_word($ac,”河边”);
acfilter_add_word($ac,”狗屎”);
acfilter_add_word($ac,”,”);
acfilter_add_word($ac,”工信部”);
acfilter_prepare($ac);
print_r(acfilter_check_text($ac,”曾经有一个很狗屎的部门,叫工信部,到河边自杀了”));
acfilter_close($ac);

运行后输出为包含的各个禁词用空格连起来的一个字符串,如下所示:

resource(4) of type (Acfilter Index)
狗屎 , 工信部 , 河边

具体可参见example.php;
5:有任何Bug,请发信给:xurenlu@gmail.com,谢谢!

PHP版的slow-query

slowphp是由本人开发的一个简单的PHP扩展。目的在于记录web server上执行时间过长的php脚本。用法和mysql上的slow query极为相似。
代码地址:http://github.com/xurenlu/slowphp/.本周内即可完成全部功能。
版本: 1.0
示例:在php.ini中加入:

extension=slowphp.so
[slowphp]
slowphp.long_query_time=3
slowphp.long_query_log=”/var/log/php_long_query.log”

然后重启yapache,运行一段时间后即可查看/var/log/php_long_query.php中记录下了慢脚本的启动时间,消耗时间和脚本路径。
下一步功能:
为了方便调试,下一步将在ini中多加这样两项配置:

slowphp.long_query_log_probability=0.0001
slowphp.long_query_lock_file=”/tmp/open_long_query”

功能分别为:
1.有0.0001的概率记录当前脚本执行时间。
2.有/tmp/open_long_query文件存在时才记录脚本运行文件。
这样一来能极大地方便线上脚本运行效率的监控。

PHP注释查看器

今天用着pydoc用的特爽,特希望能够找到一个php下的查看注释的工具。php生成文档倒是有一个phpdocument,另外还有一个给c/c++生成文档的doxygen也能用来给php生成文档。可是就是都太麻烦。于是我的用py写了一个查看php的注释的,能够逐行读入php代码,区分用/*来给出的注释。目前只能查看phpdocument方式的注释,另外,类里面的函数不能正确给出类名。不过在很多情况下够用了。关键是小巧。 

请在http://xurenlu.googlecode.com/files/phpcomment.py 这里下载。使用很简单。用 phpcomment.py < phpfile  或 phpcomment.py phpfile即可。

 

动态域名方案之:phppod

  • 2010.03.31:请最近这几天使用phppod有问题的升级到1.0.6版本;
  • 最新更新:到http://github.com/xurenlu/phppod/downloads 去下载1.05的
    然后运行
    /usr/share/podclient/initconf.php -u **** -p ****
    初始化一份配置文件,存到
    /etc/podclientd.conf
    中,手动修改必须的参数,再启动之.
  • phppod是我开发的一套unix/linux/mac下的动态域名方案。这是一个dnspod.com的API的客端.用户只需要配置/etc /podclientd.conf这个配置文件,即可随时更新dnspod上的ip信息.[这个项目一没有高性能,二也不功能强大…,就是方便实用吧.]
    项目托管在http://code.google.com/p/phppod/.
    项目的新主页:
    http://github.com/xurenlu/phppod/
    这是一个花生壳的替代方案。花生壳的特点是各种客户端等都很齐全,不少路由器也内置了花生壳的方案。但缺点也很明显,不能使有花生壳来绑定顶级域名,个数也有限制。而dnspod.com的服务却可以让你添加n个顶级域名,每个顶级域名下可添加数个子域名。另外,dnspod.com的服务可以依据线路选择解析到不同的IP上。
    DNSPOD已经管理着数十万个站点的dns,是一个可靠的目前[至少到目前为止].
    使用方法:
    1.先通过dnspod.com的网站注册,将您的域名的dns解析转移给dnspod.com;
    2.在您的机器上安装phppod.
    如果是ubuntu/debian系列,请从项目主页下载deb包:
    dpkg -i phppod-*.deb
    如果是其他linux/unix版本,请从项目主页下载src包,按照README的说明来安装。:
    <pre>
    $cd phppod-1.0.0
    $cd pkg
    $sudo  make install
    </pre>
    来安装.
    3.配置:
    请修改/etc/podclientd.conf文件.
    4.运行:
    /usr/bin/podclient -c /etc/podclientd.conf >/var/log/podclient.log &
    php /usr/bin/podclient -c /etc/podclientd.conf
    欢迎各位和我一样在家里搭服务器,IP天天变的同志们使用并反馈.

    附记:如果无法运行,请将错误输出发给我。谢谢。我的 gtalk:xurenlu#gmail.com  [请将#换成@]

    用fastCGI协议进行RPC调用

    近来由于业务量急剧增长,业务种类越来越多,RPC混乱问题就凸现出来.
    具体表现是:
    a1,a2,a3,a4 为一组服务器,为用户提供A服务.
    b1,b2,b3为一组服务器,为用户提供B服务.
    c1,c2,c3为一组服务器,为用户提供C服务.
    最初各服务器各自服务是不太相关的.随着业务拓展,用户提出新的需求,我们需要
    在A服务中调用B组服务器的API接口.
    ….
    最后我们发现这样一个现象:
    用户请求a1 提供服务.a1发现他需要知道另一些数据,于是调用b2的rpc服务.但是b2
    上这个数据又需要c3的RPC.结果c3又需要a2来提供一些数据….
    我们的远程调用调来调去,最后把自己调晕了.

    于是我开始考虑一种解决方案。
    首先当然是:对远程调用加以控制和规范,避免不必要的远程调用。
    接着我注意到,我们利用CURL来通过http通道进行远程调用其实是没必要的。我可以在做远程调用时,走FastCGI协议。

    说干就干:
    第一步:建立一个fastCGI:spawn-php

    #!/bin/bash

    ## ABSOLUTE path to the spawn-fcgi binary
    SPAWNFCGI=”/home/y/opt/lighttpd/bin/spawn-fcgi”

    ## ABSOLUTE path to the PHP binary
    FCGIPROGRAM=”/home/y/opt/php/bin/php-cgi”

    ## TCP port to which to bind on localhost
    FCGIPORT=”1026″

    ## number of PHP children to spawn
    PHP_FCGI_CHILDREN=10

    ## maximum number of requests a single PHP process can serve before it is restarted
    PHP_FCGI_MAX_REQUESTS=1000

    ## IP addresses from which PHP should access server connections
    FCGI_WEB_SERVER_ADDRS=”127.0.0.1,192.168.2.10″

    # allowed environment variables, separated by spaces
    ALLOWED_ENV=”ORACLE_HOME PATH USER”

    ## if this script is run as root, switch to the following user
    USERID=y
    GROUPID=y

    ################## no config below this line

    if test x$PHP_FCGI_CHILDREN = x; then
    PHP_FCGI_CHILDREN=5
    fi

    export PHP_FCGI_MAX_REQUESTS
    export FCGI_WEB_SERVER_ADDRS

    ALLOWED_ENV=”$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS”

    if test x$UID = x0; then
    EX=”$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN”
    else
    EX=”$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -C $PHP_FCGI_CHILDREN”
    fi

    # copy the allowed environment variables
    E=

    for i in $ALLOWED_ENV; do
    E=”$E $i=${!i}”
    done

    # clean the environment and set up a new one
    env – $E $EX

    2.接着我们建立这样的文件:http.txt

    for($i=0;$i<100;$i++)
    {
    echo rand();
    echo ‘….Scene of shooting at Nebraska shopping centre
    Eight killed in Nebraska shooting
    A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
    Scene of shooting at Nebraska shopping centre
    Eight killed in Nebraska shooting
    A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
    Scene of shooting at Nebraska shopping centre
    Eight killed in Nebraska shooting
    A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
    Scene of shooting at Nebraska shopping centre
    Eight killed in Nebraska shooting
    A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
    ‘;
    }
    print “done!”;

    这个做为是远程接口。
    3.下面比较CURL和fastCGI两种访问remote API的方式:
    A:走FastCGI:

    include “./mod_fcgi.php”;
    $fcgi=new mod_fcgi();
    $args=”127.0.0.1:1026″;
    $filename=”/home/y/www/qps/http.php”;
    $fcgi->parser_open($args,$filename,$rq_err,$cgi_headers);
    print($fcgi->parsed_output);
    echo “n=============n”;

    B:走CURL通道:

    include “./curl.php”;
    $curl=& new CURL();
    echo $curl->get(“http://localhost/qps/http.php”);
    echo “n=============n”;

    4我们比较FCGI方式和CURL方式的差异:
    FCGI方式进行远程调用的QPS:

    Total transferred: 249306 bytes
    HTML transferred: 244410 bytes
    Requests per second: 275.77 [#/sec] (mean)
    Time per request: 3.626 [ms] (mean)
    Time per request: 3.626 [ms] (mean, across all concurrent requests)
    Transfer rate: 2233.76 [Kbytes/sec] received

    HTTP通道进行远程调用的QPS:

    Total transferred: 2244515 bytes
    HTML transferred: 2240015 bytes
    Requests per second: 204.18 [#/sec] (mean)
    Time per request: 4.898 [ms] (mean)
    Time per request: 4.898 [ms] (mean, across all concurrent requests)
    Transfer rate: 14911.66 [Kbytes/sec] received

    经过多次比较,确认用fastCGI通道时,效率比http方式要高。
    但是….这个差别并不大,而且,使用lighttpd的spawn-cgi来充当fastcgi的守护进程,还不是特别稳定。
    另外,经过我的测试,只有当远程调用的结果有较多的输出时,FastCGI协议与HTTP协议相比才有优势。在通过网络传输的数据不多的情况下(就是http.php几乎没有输出的情况下),用CURL来调远端调用,反而比FastCGI方式慢(显而易见,mod_fcgi是自行封装的用PHP的socket函数来进行网络操作的class,而Curl是一个编译了的php扩展).
    因此,我忙活了半天,最后得出的结论是,目前还不能在公司大规模加以运用。
    但是对于小型企业,创业型公司来说,这种效率对比还是很有用的,可以加以挖掘。

    用ab来做性能测评好像不公平吧?

    我的师兄,从某种程度上说也是我php方面的师父,和他的同事做了测评,分别是针对php4,php5的性能对比和function,class的性能对比的。
    这里是师兄的对比结果
    师兄的同事做的测评
    但是我不认为用ab来做出的测试是合理的.理由:用ab来测试时,结果好像总似是在跳舞一样.做为证据,我将我的notebook依文本方式重启,用ab来测lighttpd的表现.
    具体环境:
    Haier H40S Notebook
    RAM:1.5G
    CPU:CY 1.6GHz
    硬盘:60G,(具体型号什么的不清楚,列个60G表示不是SCSI硬盘)
    OS:Fedora Core 7.0(Moonshine)
    web server:lighttpd 1.4.15
    测试工具:ab
    X环境:未运行X server
    命令:ab -n 10000 -c 50 http://localhost:8181/
    第一份结果:

    This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.786830 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10000
    Total transferred: 4980000 bytes
    HTML transferred: 3450000 bytes
    Requests per second: 5596.50 [#/sec] (mean)
    Time per request: 8.934 [ms] (mean)
    Time per request: 0.179 [ms] (mean, across all concurrent requests)
    Transfer rate: 2721.58 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 3 2.6 4 8
    Processing: 1 4 0.7 5 6
    Waiting: 0 1 1.7 2 5
    Total: 5 8 2.2 8 13
    WARNING: The median and mean for the processing time are not within a normal deviation
    These results are probably not that reliable.

    Percentage of the requests served within a certain time (ms)
    50% 8
    66% 10
    75% 10
    80% 11
    90% 11
    95% 12
    98% 12
    99% 12
    100% 13 (longest request)

    这里的结果是Requests per second: 5596.50 [#/sec] (mean)(插一句,lighttpd的性能真是好,用apache从来没上过3000)
    第二份ab -n 10000 -c 50的结果:

    This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.313719 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10011
    Total transferred: 4985478 bytes
    HTML transferred: 3453795 bytes
    Requests per second: 7611.98 [#/sec] (mean)
    Time per request: 6.569 [ms] (mean)
    Time per request: 0.131 [ms] (mean, across all concurrent requests)
    Transfer rate: 3705.51 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.0 1 5
    Processing: 1 5 2.0 5 32
    Waiting: 0 3 1.8 3 30
    Total: 1 6 2.1 6 35

    Percentage of the requests served within a certain time (ms)
    50% 6
    66% 6
    75% 6
    80% 6
    90% 7
    95% 8
    98% 10
    99% 11
    100% 35 (longest request)

    结果表明RPS是Requests per second: 7611.98 [#/sec] (mean).
    第三份结果:

    This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.300247 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10009
    Total transferred: 4984482 bytes
    HTML transferred: 3453105 bytes
    Requests per second: 7690.85 [#/sec] (mean)
    Time per request: 6.501 [ms] (mean)
    Time per request: 0.130 [ms] (mean, across all concurrent requests)
    Transfer rate: 3743.14 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.0 1 5
    Processing: 1 4 1.4 5 11
    Waiting: 0 2 1.1 3 8
    Total: 1 6 1.2 6 14

    Percentage of the requests served within a certain time (ms)
    50% 6
    66% 6
    75% 6
    80% 6
    90% 7
    95% 9
    98% 10
    99% 11
    100% 14 (longest request)

    RPS结果是Requests per second: 7690.85 [#/sec] (mean).
    第四份结果是:

    This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.315784 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10033
    Total transferred: 4996434 bytes
    HTML transferred: 3461385 bytes
    Requests per second: 7600.03 [#/sec] (mean)
    Time per request: 6.579 [ms] (mean)
    Time per request: 0.132 [ms] (mean, across all concurrent requests)
    Transfer rate: 3708.06 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 1 1.2 1 8
    Processing: 1 4 1.4 5 11
    Waiting: 0 2 1.1 3 8
    Total: 1 6 1.4 6 15

    Percentage of the requests served within a certain time (ms)
    50% 6
    66% 6
    75% 6
    80% 6
    90% 7
    95% 9
    98% 11
    99% 12
    100% 15 (longest request)

    结果是Requests per second: 7600.03 [#/sec] (mean).
    第五份结果是:

    This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Copyright 2006 The Apache Software Foundation, http://www.apache.org/

    Benchmarking localhost (be patient)

    Server Software: lighttpd/1.4.15
    Server Hostname: localhost
    Server Port: 8181

    Document Path: /
    Document Length: 345 bytes

    Concurrency Level: 50
    Time taken for tests: 1.812989 seconds
    Complete requests: 10000
    Failed requests: 0
    Write errors: 0
    Non-2xx responses: 10000
    Total transferred: 4980000 bytes
    HTML transferred: 3450000 bytes
    Requests per second: 5515.75 [#/sec] (mean)
    Time per request: 9.065 [ms] (mean)
    Time per request: 0.181 [ms] (mean, across all concurrent requests)
    Transfer rate: 2682.31 [Kbytes/sec] received

    Connection Times (ms)
    min mean[+/-sd] median max
    Connect: 0 3 2.7 4 9
    Processing: 1 4 0.8 5 6
    Waiting: 0 1 1.7 2 5
    Total: 5 8 2.3 9 13
    WARNING: The median and mean for the processing time are not within a normal deviation
    These results are probably not that reliable.

    Percentage of the requests served within a certain time (ms)
    50% 9
    66% 10
    75% 10
    80% 11
    90% 12
    95% 12
    98% 12
    99% 12
    100% 13 (longest request)

    RPS结果是Requests per second: 5515.75 [#/sec] (mean);

    可以看到,同是ab -n 10000 -c 50 http://localhost:8181/,结果大不一样,不仅分为7600RPS和5500RPS两档,而各档中具体数据也不一样.这个结果可以理解,OS中总是会有各种各样的消息要处理,影响具体数据结果也很正常.
    因此,谢华亮(sir?mm?)的测试用ab的结果来进行php4,php5的性能比较是不太对的.至少目前看来,我没有从他的文章中看到他进行了多次ab测评后取结果的平均值.但是他列出来这样一个结果:

    版本 函数测试 不实例化类 实例化类 类的继承
    PHP 4.4.2 1047.23/rps 1034.98/rps 1006.14/rps 992.95/rps
    PHP 5.2.1 1176.06/rps 1197.17/rps 1187.93/rps 1128.54/rps

    这大致可以说明,php5.2确实是比php4.4.2要快.但是从1197.17>1176.06得出php5的类跑得比functiong还快,我不这么认为.只是21个request的差别,太小了,ab测试的随便一个风吹草吹就行了(而且说class比function要快,严重地伤害了我的感情,哈哈)…
    嗯,先整这么多.有空好好研究一下,如何对web程序进行性能测评.
    另外,有空见到这两位兄台,好好争论一番.

    老覃的性能测试

    老覃同学做了一个测试,来比较PHP5下利用function,class来编程时的效率差异。
    我一向喜欢钻牛角尖:
    有两个疑问:
    1.ab本身的文档说了,ab自身是需要CPU资源的,有时候要注意你可能不是在测apache的性能,而是在测ab这个软件的性能。老覃同志如何去除ab的影响?
    2.php编译时也是花费CPU时间的。我做了另一组测试:

    //t1.php

    function signin()

    {

    echo “signin”;

    }

    signin();

    ?>

    ab -n 10000 -c 50 的结果是:
    1534.15 [#/sec]
    Time per request: 32.591 [ms] (mean)

    ,再另外一个:

    function signin()

    {

    echo “signin”;

    }

    //signin();

    ?>

    ab -n 10000 -c 50的结果是:
    1748.48 [#/sec], Time per request: 28.596 。
    就是说,算上ab的花费,apache的花费,php编译的花费,这几个的时间消费可能已经比php代码运行的时间花费要大了。加上运行的代码后,只相关几个ms。
    如果要进行精确的比较,老覃的做法可能很不可靠。
    PHP4与PHP5.20的效率目前还只有看官方的数据。
    另外有个疑问,我的php比老覃同志的似乎快了不少,相差好几倍。可能是我的是Fedora 下运行的结果。

    附注:

    我后来做了一个实验,ab -n 10000 -c 50 http://localhost/test/23442.php ,返回的结果是:


    Requests per second: 2192.03 [#/sec] (mean)
    Time per request: 22.810 [ms] (mean)

    这是在请求的文件不存在下,apache简单返回一个静态面的情况下的。由此看来,ab和apache的开销就已经占了大约20ms.

    再注,在这里
    是老覃的同事做的测试.我google得到了这个结果.