Archive for the ‘php性能’ Category

 
Dec
06
Posted (xurenlu) in php性能, php技术 on 12月-6-2007

近来由于业务量急剧增长,业务种类越来越多,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

  1. #!/bin/bash
  2.  
  3. ## ABSOLUTE path to the spawn-fcgi binary
  4. SPAWNFCGI="/home/y/opt/lighttpd/bin/spawn-fcgi"
  5.  
  6. ## ABSOLUTE path to the PHP binary
  7. FCGIPROGRAM="/home/y/opt/php/bin/php-cgi"
  8.  
  9. ## TCP port to which to bind on localhost
  10. FCGIPORT="1026"
  11.  
  12. ## number of PHP children to spawn
  13. PHP_FCGI_CHILDREN=10
  14.  
  15. ## maximum number of requests a single PHP process can serve before it is restarted
  16. PHP_FCGI_MAX_REQUESTS=1000
  17.  
  18. ## IP addresses from which PHP should access server connections
  19. FCGI_WEB_SERVER_ADDRS="127.0.0.1,192.168.2.10"
  20.  
  21. # allowed environment variables, separated by spaces
  22. ALLOWED_ENV="ORACLE_HOME PATH USER"
  23.  
  24. ## if this script is run as root, switch to the following user
  25. USERID=y
  26. GROUPID=y
  27.  
  28. ################## no config below this line
  29.  
  30. if test x$PHP_FCGI_CHILDREN = x; then
  31. PHP_FCGI_CHILDREN=5
  32. fi
  33.  
  34. export PHP_FCGI_MAX_REQUESTS
  35. export FCGI_WEB_SERVER_ADDRS
  36.  
  37. ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS FCGI_WEB_SERVER_ADDRS"
  38.  
  39. if test x$UID = x0; then
  40. EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN"
  41. else
  42. EX="$SPAWNFCGI -p $FCGIPORT -f $FCGIPROGRAM -C $PHP_FCGI_CHILDREN"
  43. fi
  44.  
  45. # copy the allowed environment variables
  46. E=
  47.  
  48. for i in $ALLOWED_ENV; do
  49. E="$E $i=${!i}"
  50. done
  51.  
  52. # clean the environment and set up a new one
  53. env - $E $EX

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

  1. for($i=0;$i<100;$i++)
  2. {
  3. echo rand();
  4. echo '....Scene of shooting at Nebraska shopping centre
  5. Eight killed in Nebraska shooting
  6. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  7. Scene of shooting at Nebraska shopping centre
  8. Eight killed in Nebraska shooting
  9. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  10. Scene of shooting at Nebraska shopping centre
  11. Eight killed in Nebraska shooting
  12. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  13. Scene of shooting at Nebraska shopping centre
  14. Eight killed in Nebraska shooting
  15. A gunman opens fire in a shopping centre in the US state of Nebraska, killing at least eight people.
  16. ';
  17. }
  18. print "done!";

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

  1. include "./mod_fcgi.php";
  2. $fcgi=new mod_fcgi();
  3. $args="127.0.0.1:1026";
  4. $filename="/home/y/www/qps/http.php";
  5. $fcgi->parser_open($args,$filename,$rq_err,$cgi_headers);
  6. print($fcgi->parsed_output);
  7. echo "\n=============\n";

B:走CURL通道:

  1. include "./curl.php";
  2. $curl=& new CURL();
  3. echo $curl->get("http://localhost/qps/http.php");
  4. echo "\n=============\n";

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

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

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

  1. Total transferred:      2244515 bytes
  2. HTML transferred:       2240015 bytes
  3. Requests per second:    204.18 [#/sec] (mean)
  4. Time per request:       4.898 [ms] (mean)
  5. Time per request:       4.898 [ms] (mean, across all concurrent requests)
  6. 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扩展).
因此,我忙活了半天,最后得出的结论是,目前还不能在公司大规模加以运用。
但是对于小型企业,创业型公司来说,这种效率对比还是很有用的,可以加以挖掘。


Tag:
相关文章


     
    Aug
    21
    Posted (xurenlu) in php性能, php技术 on 08月-21-2007

    我的师兄,从某种程度上说也是我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/
    第一份结果:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. 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的结果:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. 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).
    第三份结果:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. 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).
    第四份结果是:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. 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).
    第五份结果是:

    1. This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
    2. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    3. 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测评后取结果的平均值.但是他列出来这样一个结果:

    1. 版本 函数测试 不实例化类 实例化类 类的继承
    2. PHP 4.4.2 1047.23/rps 1034.98/rps 1006.14/rps 992.95/rps
    3. 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程序进行性能测评.
    另外,有空见到这两位兄台,好好争论一番.


    Tag:
    相关文章


       
      Aug
      21
      Posted (xurenlu) in php性能 on 08月-21-2007

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

      1. //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 ,返回的结果是:

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

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

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


      Tag:
      相关文章


         
        Aug
        15
        Posted (xurenlu) in php性能 on 08月-15-2007

        两段代码,都是用来1到100之前计算三次方的.
        同样的代码,第一个其实只需要一行(当然要考虑美观,分成了四行);
        第二个估计要用上100来行;但是哪个更快呢?….
        读者说哪个程序更好?

        1.  

        function getPower($n)
        {
        return $n*$n*$n;
        }

        global $data;
        $data=array(
        1=>1,
        2=>8,
        3=>27,
        4=>64,
        5=>125…
        );
        function getPower($n)
        {
        global $n;
        return $data[$n];
        }


        Tag:
        相关文章


           
          Aug
          14
          Posted (xurenlu) in php性能 on 08月-14-2007

          前面几篇文章提到了APC.很多人问我:APC是什么?这里做个比较全面的介绍:
          APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”,但我个人觉得应该叫”另一个PHP缓存”.因为这个东西如果叫”可选PHP缓存”,容易给人一种可要可不要的,不怎么有用的错觉.
          APC的主页是:<a href=”http://pecl.php.net/package/apc” mce_href=”http://pecl.php.net/package/apc”>http://pecl.php.net/package/apc</a>.目前的版本是3.0.14,通过PECL安装,需要php4.3.0或更高版本.
          <b>APC的安装:</b>
          一般是下载源代码然后phpize来编译安装,安装完以后在加上php.ini里加上
          <coolcode>
          extension=apc.so
          </coolcode>
          这么一行就行了.
          <b>APC的使用</b>
          APC的使用其实倒说不上.APC是个优化器,自安装之日起,就默默地在后台为您的PHP应用服务了.您的所有PHP代码会被缓存起来.

          另外,APC可提供一定的内存缓存功能.但是这个功能并不是十分完美,有报告说如果频繁使用APC缓存的写入功能,会导致不可预料的错误.如果想使用这个功能,可以看看apc_fetch,apc_store等几个与apc缓存相关的函数.
          从PHP5.2开始,APC引入了一个小甜饼,解决了困扰大家已久的大文件上传的进度条问题.具体请看看我这篇<a href=”http://www.162cm.com/archives/406.html” mce_href=”http://www.162cm.com/archives/406.html”>blog</a>.
          <b>APC的高级使用</b>
          1.缓存期限:
          APC的缓存分两部分:系统缓存和用户数据缓存.
          系统缓存是自动使用的,是指APC把PHP文件源码的编译结果缓存起来,然后在再次调用时先对比时间标记。如果未过期,则使用缓存代码运行。默认缓存3600s(一小时).但是这样仍会浪费大量CPU时间.因此可以在php.ini中设置system缓存为永不过期(apc.ttl=0).不过如果这样设置,改运php代码后需要restart一下您的web服务器(比如apache…).目前对APC的性能测试一般指的是这一层cache;
          用户数据缓存由用户在编写php代码时用apc_store和apc_fetch函数操作读取、写入的.如果量不大的话我建议可以使用一下.如果量大,我建议使用memcache会更好.
          如果要享受APC带来的缓存大文件上传进度的特性,需要在php.ini中将apc.rfc1867设为1,并且在表单中加一个隐藏域APC_UPLOAD_PROGRESS,这个域的值可以随机生成一个hash,以确何唯一.具体例子请参见前面给出的链接.
          2.状态控制和分析:
          APC的源码包自带了一个apc.php;您可以将这个文件上传到web服务器的某个目录下,用浏览器访问,这会显示当前的状态.我们可以从这里的表格分析当前的缓存状况,作出进一步优化.
          apc-info-clublocalhost2.png
          这是某test站点的状态.您可以慢慢分析,这个工具会提供很多有用的工具.比如您可以看到哪些文件经常被包含(访问),您缓存的哪个变量经常被读取,或经常被更新等.
          最后顺便提一句,有独立报告说,APC的代码缓存、优化效果要高出zend优化器.就算不是真的,他开源而又免费,实在是一个相当不错的选择.


          Tag:
          相关文章


             
            Aug
            13
            Posted (xurenlu) in php性能 on 08月-13-2007

            phpfox是国外的一款社区软件,具有论坛,博客,相册,音乐,投票,问答,视频等功能,基于php,mysql.安装需要gd库的支持。

            我拿到程序后修改的第一步:

            1.修改用户接口部分。 phpfox是典型的单入口型程序和类MVC架构。具体怎么改我不加描述了,只提一下,因为phpfox把对几乎所有路径的访问全部rewrite到了index.php,所以要在.htaccess文件中加上这样的两行:

            1. Rewritecond %{REQUEST_FILENAME} !-f
            2. Rewritecond %{REQUEST_FILENAME} !-d

            一共要加两次(针对1.5,1.6这两个版本)。如果没有启用rewrite,就没有这会事。用户分别是{PREFIX}_user表,如果自行进行数据整合,操作这个表就可以了。
            2.汉字在显示时有问题,需要看以下这些模板:

            design/./templates/default/_modules/Menu/TabbedMenu.html
            design/./templates/default/_modules/Listing/ListingCreate.html
            design/./templates/default/_modules/Listing/ListingCreate.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Account/ProfileSettings.html
            design/./templates/default/_modules/Ads/AdsList.html
            design/./templates/default/_modules/Event/Calendar.html
            design/./templates/default/_modules/Event/AddForm.html
            design/./templates/default/_modules/Event/AddForm.html
            design/./templates/default/_modules/Event/AddForm.html
            design/./templates/default/_modules/Event/AddForm.html
            design/./templates/default/_modules/Event/AddForm.html
            design/./templates/default/_modules/Event/FeaturedEvents.html
            design/./templates/default/_modules/Event/FeaturedEvents.html
            design/./templates/default/_modules/Event/EventView.html
            design/./templates/default/_modules/Event/EditForm.html
            design/./templates/default/_modules/Event/EditForm.html
            design/./templates/default/_modules/Event/EditForm.html
            design/./templates/default/_modules/Event/EditForm.html
            design/./templates/default/_modules/Event/EditForm.html
            design/./templates/default/_modules/Video/Main.html
            design/./templates/default/_modules/Video/AjaxBox.html
            design/./templates/default/_modules/Video/ModifyCategories.html
            design/./templates/default/_modules/Video/ApproveVideos.html
            design/./templates/default/_modules/Video/AjaxLatest.html
            design/./templates/default/_modules/Video/Categories.html
            design/./templates/default/_modules/Video/Browse.html
            design/./templates/default/_modules/Video/View.html
            design/./templates/default/_modules/Blog/NewBlogs.html
            design/./templates/default/_modules/Blog/MemberBlogs.html
            design/./templates/default/_modules/Blog/AddBlog.html
            design/./templates/default/_modules/Blog/MyPageBlogs.html
            design/./templates/default/_modules/Blog/MyPageBlogView.html
            design/./templates/default/_modules/Blog/BlogList.html
            design/./templates/default/_modules/Blog/BlogList.html
            design/./templates/default/_modules/Blog/BlogList.html
            design/./templates/default/_modules/Blog/BlogList.html
            design/./templates/default/_modules/Blog/EditBlog.html
            design/./templates/default/_modules/Blog/EditBlog.html
            design/./templates/default/_modules/Blog/View.html
            design/./templates/default/_modules/Blog/View.html
            design/./templates/default/_modules/Groups/GroupForumPosts.html
            design/./templates/default/_modules/Groups/NewGroups.html
            design/./templates/default/_modules/Groups/GroupDetails.html
            design/./templates/default/_modules/Shoutbox/Box.html
            design/./templates/default/admin/language/options.html
            design/./templates/default/admin/language/options.html
            design/./templates/default/admin/language/options.html
            design/./templates/default/admin/language/missing-options.html
            design/./templates/default/admin/language/add-phrase.html
            design/./templates/default/admin/language/add-phrase.html
            design/./templates/default/admin/language/phrases.html
            design/./templates/default/admin/language/phrases.html
            design/./templates/default/admin/language/phrases.html
            design/./templates/default/admin/language/add-option.html
            design/./templates/default/admin/language/missing.html

            里面会有<{$title|escape}>这样的句子。将”|escape”删掉即可修正汉字bug.
            3.敏感词过滤:phpfox为了扩展性,是在显示时过滤的,没有这个必要。我们把显示层的过小滤去掉,然后在index.php的第一行就加上过滤(如果有post数据,将之过滤)。这样将过滤机制更改之后,CPU又节省不少。
            4.未登陆用户cache层。对于未登陆用户,没必要时时都是显示最新的。又是在index.php的第一行加上过滤:如果用户未登陆且无post数据,则显示cache层的静态文件。有1%的机率更新cache.

            优化之前:

            Document
            Path: /
            Document Length: 23960 bytes
            Concurrency Level: 1
            Time taken for tests: 2.740130 seconds
            Complete requests: 30
            Failed requests: 0
            Write errors: 0
            Total transferred: 733950 bytes
            HTML transferred: 718800 bytes
            Requests per second: 10.95 [#/sec] (mean)
            Time per request: 91.338 [ms] (mean)
            Time per request: 91.338 [ms] (mean, ac

            优化之后:

            Server Software: Apache/2.2.4
            Server Hostname: ***.com
            Server Port:
            80
            Document Path: /
            Document Length: 23960 bytes
            Concurrency Level: 1
            Time taken for tests: 0.32685 seconds
            Complete requests: 30
            Failed requests: 0
            Write errors: 0
            Total transferred: 730560 bytes
            HTML transferred: 718800 bytes
            Requests per second: 917.85 [#/sec] (mean)
            Time per request: 1.090 [ms] (mean)
            Time per request: 1.090 [ms] (mean, across
            all concurrent requests)
            Transfer rate: 21814.29
            [Kbytes/sec] received
            Connection Times (ms)
            min mean[+/-sd] median max
            Connect: 0
            0 0.0
            0 0
            Processing: 0 0
            1.0 1 1
            Waiting: 0
            0 0.3
            0 1
            Total: 0
            0 1.0
            1 1

            又节约了不少资源。

            4。数据库结构修改:

            a.phpfox_online_session,phpfox_online,phpfox_site_session的数据都不需要永久保存。直接改成内存表。

            由于内存表不支持txt类型,因此将tinytxt,text类型的字段均改为varchar字段。

            现在做的改动有:

            phpfox_online:

            user( tinytext) 改为:user(varchar(32)

            page (tinytext )改为page(varchar(100)

            ip(tinytext)改为(varchar(16) )

            phpfox_site_session:

            browser:改为varcahr(64)

            host:改为varchar(32)

            page:改为varchar(64)

            referer:改为varchar(64).

            这个改过之后我试了一下,有些字段长度还可以进一步改小,这样才能将session数据都做成内存表,速度又可以大上一层楼。
            b.flashchat_templates
            这个表非常搞笑,有2万条记录,好像是在”CAN I FUCK YOU”和”<srai>DO YOU WANT TO HAVE
            SEX</srai>”类似的句子之间做替换。基本没用(尤其是对中文).依我的看法如果这个表能导致瓶颈,就清空掉好了。

            c.flashchat_patterns
            这个表巨大无比,有15万条记录。主要是英文。如果可以的话,可以给他瘦身一下。

            d.mysql的连接方式为mysql_connect,这个可以修改为mysql_pconnect。视具体情况。
            e.许多表没有加索引,最搞的是论坛的topic表没有给group_id这个字段加索引。真是让人郁闷。注意把数据库结构整个看一遍,挨个把屁股擦干净。

            5.去掉title中的标识:

            修改include/modules/Site/classes/PhpFox_ComponentSiteTitle.class.php
            中,将第200行的:

            198 if (App::removeBrand())

            199 {

            200 // $sTitle
            .= ‘ (Powered by phpFoX)’;

            201 }

            改掉就行了。(提醒大家,phpfox不允许未付费用户去这个标识。去这个标识需要另付费75$.

            好啦,现在他可以支撑1000人在线了(其实我还加装了php-apc,这个东东把php编译结果缓存起来,另外把图片等静态文件进行了分流)。


            Tag:
            相关文章


               
              Jul
              26
              Posted (xurenlu) in php性能 on 07月-26-2007

              APC由于能够缓存文件上传进度,因此算是解决了一直以来困挠PHP开发人员的一个老大难,所以我也特别喜欢他了。如果对php实现文件上传进度条有困 难,可以看这里
              不过今天发现,APC宣称的加速功能,其实也是一种缓存,而不是对编译方式,编译过程什么的进行了优化.
              原因是,我把两个程序目录名称对调,结果发现,程序报错了.但是让人郁闷的是,错误提示是在一个已经不存在的文件的109行。后来不管怎么刷新,都是这个结果.后来只好重启web服务器了事.
              看来,APC是把编译好的php文件存放在共享内存中,以后是每过一段特定时间才重新编译一次.对于已经运行的应用,这个将大大节省你的CPU占用(虽然PHP的编译已经非常非常地快了,开启APC缓存后,仍能大副度地加速你的PHP,因为php源文件不需要在每次调用时都要编译了).从原理上说,PHP已经被改造成了Jsp式的静态脚本.只是PHP+APC的组合比Jsp的还要快,因为JSP在运行时会不断检测JSP源文件是否已经被更新,不断检测XML配置文件是否被更新.
              但是,调试期间可能需要重启Apache.
              目前没有在Lighttpd下检测以FastCGI方式运行时加入APC对PHP性能的影响。


              Tag:
              相关文章


                 
                Apr
                30
                Posted (xurenlu) in php性能 on 04月-30-2007

                英文原文(并非按词一个个译过来的)
                http://martinjansen.com/2007/04/upload-progress/
                这里是Rasmus Lerdorf实现的一个利用php5.2的新特性来进行上传进度条的例子。
                为了让php存储并显示文件上传进度,他利用了APC来实现内存级缓存。APC最新的版本有一个特性(虽然没有文档化),一旦开启,将会监听包含APC_UPLOAD_PROGRESS的表单的文件上传进度。一旦发现这个POST变量,APC将会创建一个缓存入口,并把文件上传进度放到这个缓存里。这个入口的值取决于POST变量APC_UPLOAD_PROGRESS的值 。

                如果你仔细看他的例子代码,你发现他用了apc_fetch来读内存值。同时在共享内存里,包含了APC_UPLOAD_PROGRESS这个魔术数字。

                但是怎么让APC像这样工作呢?文档中并没有告诉我们。其实在CVS里的安装说明上写了:
                在php.ini文件设置apc.rfc1867=1就行了。

                我把例子代码弄过来了:

                1.  

                if($_SERVER['REQUEST_METHOD']==’POST’) {
                $status = apc_fetch(’upload_’.$_POST['APC_UPLOAD_PROGRESS']);
                $status['done']=1;
                echo json_encode($status);
                exit;
                } else if(isset($_GET['progress_key'])) {
                $status = apc_fetch(’upload_’.$_GET['progress_key']);
                echo json_encode($status);
                exit;
                }
                ?>







                 

                附本人意见:
                php5.2之前解决大文件上传进度条显示一种是猜临时文件名另一种是用php创建webserver,需要iptables打开一些80之外的端口,还有一些是自己编译apache或php模块,基本没太大用途。有时间我详细说一下这几种情况。
                目前这个看起来似乎是一个比较漂亮的解决办法。但是仍需要系统管理员(root)权限来装APC和改php.ini文件。
                希望在更新版本中php能给出一个比较好的解决文件上传的办法。


                Tag:
                相关文章


                   
                  Apr
                  03
                  Posted (xurenlu) in php性能 on 04月-3-2007

                  武侠小说里常写,无招胜有招.大师们最终都要精通十八门武艺,然后最后学通一门,再融会贯通,突破前人,练就一招独门绝技.
                  我曾经折腾着要自己整文本数据库系统,自己整模板系统,自己整MVC框架.自己封装一堆操作,乐此不疲.
                  有一天我仔细地研究了Smarty模板的机制,突然良心发现,把我自己折腾的模板系统扔了.因为我发现,模板引擎的引入,初衷是简化表现层的操作,但最终Smarty的语法,已经越来越像一个php,越来越像一个新的WEB脚本了.本来是两层,php引擎解释PHP文件,现在多了一层,php引擎解释smarty引擎,smarty引擎又解释smarty模板.现在smarty的语法还在不断增加,扩展,他们正在努力在php语言的圣殿下,用smarty造一个小房子.
                  于是我在做某个网站的两会专题时,文件架构是这样的:
                  /view.php
                  /model.php
                  /index.php
                  /config.php
                  view.php文件的第一行就声明了:global
                  $data;$data是一个多维数组,它的内容已经由index.php来产生.view.php中除开这一句之外,就只包含echo语句和foreach语句了.它们就负责一行行地输出data数组的内容。
                  index.php则是入口文件,它包含了config.php,model.php
                  ,view.php.虽然不长,我还是给它实现了一个缓存功能.就是如果writable/cache.php文件存在且创建时间在10分钟以内,就直接包含cache.php并退出,否则调用wget将最新的网站显示内容读一份存到writable/cache.php中存起来.index.php是主要的执行文件.
                  config.php 则是几行配置信息,比如数据库信息啦之类.
                  model.php则是定义的函数的声明。其实这里也就三个函数.
                  现在我的工作完成了,余下的工作,就是告诉美工,要改的话,只需要修改view.php文件就行了.这个文件,随便改一下也没啥问题.
                  所谓的MVC,其实归根结底,就是可以做到如此简单.
                  所以,为什么要用smarty呢.如果要将logic和view分开,很简单,把文件一分为二,其中一个只管显示就行了。如果非要用if else 或是foreach,在smarty中也是要用的,我干吗要再去学smarty的关于if else 和foreach的语法呢,我直接在view.php中使用php标签就行了.
                  学透了以后,太多东西其实都可以这样来解决.cookie被认为是不安全的,所以往往一些系统设计了非常复杂的SESSION机制,还写大段大段的代码自行设计了加密算法.首先,加密算法有现成的可用的,没必要自己搞定.再者,看看wordpress,人家也直接在cookie存了用户名和密码.但普通人如果要在cookie中存,往往就存用户名和md5后的密码.但wordpress不这么干,人家把密码md5加密了一次,再用md5加密了一次.你不是说用户可能设置少于6位的密码吗?你不是说少于6位的密码几分钟就可以暴力破解吗?我现在两次md5加密.不就成千上万倍地增加了破解难度了吗?多简单的做法!
                  类.我不得不说一下这个.不知道为什么,人们在学会php5下的类操作后,就觉得不管什么,哪怕是写一个文件什么的,一定要封装一下.需知,OOP不是仙药,(原话应该人月神话中的:没有银弹.),OOP仍然不能解决一切,甚至不见得比Function式的编辑解决得更好.如果您决定了要写一堆Class,那么事先告诉我,您保证您写成Class的初衷不是为了好看,不是为了让老板知道您会用class了.
                  还有一些仁兄们,喜欢把程序弄得非常好看,优雅.当然如果可能,好看一点的代码谁都喜欢.但是有很多时候,好看是以数倍的性能牺牲为代价的.我在一个短短的php文件中,看到有十个以上的地方使用了eval($variable)类似的语句.(之前看到霍炬的文章我不信,后来见到这份文件我信了).我能想出来的本来可以直接运行的代码非要放进eval中去执行的理由只有:可能这样好看一些.兄弟,如果您对好看与非很在乎的话,我建议您真的应该与您的美工换一换,这样也许能做出来一个很好看的网站!
                  有些东西,真不是越复杂越好.把php弄精,两点:多看手册,多问baidu/Google(为了避免卷入google还是baidu之争,我特意两个都写上,并在注意了排序).有时间骂Zend framework太庞杂,Xoops太老套,不如坐下来看看php手册.

                  小插曲:有一天同事在争论上面一个”厌”字,下面一个”面”字该读什么,于是各显神通.最后一位同事在baidu知道上搜”上面厌 下面 面”居然就给找出答案来了,那个提问的人问的正是跟我们一样的问题.同事说:我爸爸教育我说,无论你做什么,要记住:总有人可能和我们正在做同样的事情.于是他想到可能会有人困扰这个字怎么读,就想到到baidu知道里来查.(我个人建议,那些认为自己发明了一个新点子,于是马上找风险投资,认为他的创业一定会成功的人,应该想想这个道理).同时,我这位朋友现在可能需要一份工作,他是一名精通DIV+CSS架构的网页设计师,方向是UI/UE/网页设计师,可能更偏html code方向,当然设计的底子也很扎实,如有意麻烦加我:helloasp@hotmail.com


                  Tag:
                  相关文章


                     
                    Apr
                    03
                    Posted (xurenlu) in php性能 on 04月-3-2007

                    PHP有秘籍吗?
                    有.PHP手册.
                    不信,您问问其他人.我问了不少虽不是世界大师级,但是业内也小有名气的人,他们都会说,多看看php手册.
                    之前面试了几个小孩,问过这样一个问题:如果有问题,比如难,您打算怎么解决?或是您如何学习php的?
                    您猜怎么着?
                    他们的回答分别是:有QQ上问一下朋友…. 看在线视频学的.
                    我相信以我MSN上好友名单<有几个开源项目的国内的负责人,国内几个大型站点(这里大型站点的定义是站点访问在100万以上)>,不能不说是没有高人,不过能通过msn解决的问题也不多.另外看视频更让人晕了.
                    如果想学好php,真的应该好好看看php手册.起码在想不起来函数function_aa怎么用的时候,第一个反应是打开IE,输入www.php.net/function_aa来查询,而不是上QQ去问朋友,也不是到一些根本不入流或是没人气的论坛发贴问.
                    如果选择上论坛,去php.net讨论会更好啊!


                    Tag:
                    相关文章


                       
                      Apr
                      03
                      Posted (xurenlu) in php性能 on 04月-3-2007

                      不知道各位看官都使用什么工具来进行PHP文件编写工作呢.
                      很多人使用Dreamweaver,当然这是一个很好的工具.不过,看看当前文件的可视化状态下的表现,或是使用一下代码补全功能,或是用它来弄CSS,生成几个笨拙的JS特效,就那么爽吗?

                      我推荐的有Editplus,Eclipse,Zend Studio,VIM.
                      EditPlus,看起来就像一个功能强一点的记事本,不过它有很强的配置功能,很多东西都可以通过配置文件来改良.您可以在Editplus中加上调试Java,PHP的功能.然后程序写完了只需要轻点一下工具栏上您配置好的了某个按钮,控制台下就会给出程序调试信息,运行结果。
                      另一个特点,它运行起来就像记事本一样快.
                      补充一下,它是收费的.
                      Eclipse,是IBM给开源世界的献礼,相当不错(不过在我的NoteBook下表现不稳定).它对PHP和svn的支持是通过插件来支持的.
                      Eclipse的特点是可以一个IDE编写很多语言脚本,只需要添加对应的插件,而且这些插件都表现不俗.我最初喜欢它,是因为看了老覃同志在eclipse下进行svn操作。
                      最初php
                      edit插件不支持代码自动补全,代码缩进等功能.现在最新版本已经支持了.很不错.
                      Eclipse的缺点就是东西太大了,下载下来有200多M,运行也慢.而且通过update功能来安装插件经常失败(我http方式下载就正常).另外据其他人的报告,不同的插件之前可能会产生冲突(因为不同的插件是由不同的团队开发维护的).
                      ZendStudio,这个由php两名元老的名字合起来的名字,出的东西总是表现不俗.ZendStudio,这个IDE可以说是相当专业的PHP开发IDE.我推荐它是因为:
                      a.良好的调试控制.
                      b.代码补全,提示…
                      简直爽得不得了.能够在编写时以漂浮层给出函数的说明(包括您自己定义的函数,只要您按格式写注释,它也能识别记忆,并在您下次写出函数名时就给您提示)
                      c.严格的注释格式,内置的phpdocumet功能.为您开发的工程没有好的文档而烦恼吗?用Zend studio吧.您按照他的提示写注释就是了。工程完成后在工程目录下右键,选”php document”,按提示就可以一步步生成漂亮的技术白皮书.
                      另外,他运行起来也不快,与svn的整合表现并不是很好(相比Eclipse下的svn插件),而且,价格也不菲.
                      VIM.
                      这个是我现在爱不释手的工具.
                      首先最大的特点,VIM本身就是为程序员而准备的!~
                      而且,它是免费的!
                      它已经经过千百万人的使用,遇到Bug或是非法操作或是什么段错误这种提示我没见到过.
                      VIM一般linux/Unix上都装备有了(既然它是这样一款优秀的工具,又是如此小巧,还不花一文钱,为什么不为所有人献上这一美味的菜呢?我想Linux的打包者都是这样想的).
                      VIM是一款不需要用mouse的好东西.在终端输入vim
                      file.txt启动vim后,它处于命令状态.在命令状态下按i进入编辑状态,按v进入可视状态.不管什么情况下,按”ESC”键都可退出到命令状态.在命令状态下输冒号就可输入命令.比如输:%s/file/文件/gc,就可查询file并询问是否替换成”文件”.输:wq就可保存并退出vim.输:q!就可不保存而退出.
                      我个人认为,使用VIM,编辑效率至少可提高50%.
                      Vim同时也支持配置文件,(~/.vimrc),这个脚本也可以定义函数(function),进行循环…酷毙了.
                      Vim中可以识别常见的主流脚本的关键字,比如一旦进入到的中间,您一输入function,这个词就马上变色了,看着很舒服.
                      所以,高明的程序员,应该学会Vim.


                      Tag:
                      相关文章


                         
                        Apr
                        03
                        Posted (xurenlu) in php性能 on 04月-3-2007

                        我曾经遇到这样一名求职者,再三声明自己有数年的项目管理经验.我问了这样一个问题:您在项目管理中使用的版本控制工具是什么?还特地问了CVS,SVN。然而让我失望的是,这两样,他一样也不会.我当然认为他的项目管理经验是不可靠的.
                        不会与人沟通的程序员,一般来说不是一个好的程序员.当然,还是有例外的,所以我在这里说”一般来说”.比如,如果您能独立完成一个Linux
                        kernel,或者您就是互联网之父,Unix之父,我就认为您可以不与人沟通.您就几个通宵不歇息,就整出一个baidu.com,我当然钦之偑之。遗憾的是,这样的天才总是太少了.
                        在程序员的江湖里,要学会与人沟通,协作,就一定得会至少一样协作开发工具,这里我简要介绍一下SVN.
                        SVN被设计为新一代的版本控制协议,开发者期望它能够取代CVS.事实上,也有大量的工程从CVS转投到了SVN的怀抱.Sourceforge.net就在不久前为所有的项目提供了SVN.
                        SVN的全名是Subversion.在最新的Fedore
                        Core里(就是我用的GNU/Linux操作系统,它的版本是6.0,现在已经出7.0了),已经内置了SVN,您只需要在安装的时候选择它就行了.
                        在Windows下,也有不少的版本可以选择,比如命令行的Subversion,RapidSVN,乌龟SVN等.
                        具体安装,可以查询www.subversion.org.cn。
                        安装完了之后,您需要为svn
                        server建立一个根目录.我的机器上是/var/svnroot,运行svnserve -d -r
                        /var/svnroot,就成功地运行了svn
                        server.注意,服务器文件名称是svnserve,我第一次使用时曾花了10分钟才弄清楚这个愚蠢的错误.
                        现在您可以把某一个工程导入到svn中了.比如运行:svn import /var/projects/www/
                        svn://localhost/projects/www -m “First
                        Import”,就将/var/projects/www这个工程导入到svn系统中去了.但是这样还不够,现在对/var/projects/www目录下文件的改动还不能被svn监视的.现在新建一个目录,/var/unfinished/.进入到这个目录,运行svn
                        co
                        svn://localhost/projects/www,就可以检出svn服务器上的文件.检出文件后,目录下除下您的工程文件外,还将多一个.svn目录(每一级目录下都有)这是给svn客户端使用的。现在您每改一个文件,或新增目录,都要svn
                        ci一下。比如您新增了一个newfile.php,就需要运行:

                        svn add newfile.php
                        svn ci newfile.php -m “newfile.php是为了***而加的一个文件”

                        来导入.改动的文件不需要运行svn add 命令.
                        如果您不知道当前有哪些文件改动了,可以用:

                        svn status /var/projects/www

                        来查看当前的状态.


                        Tag:
                        相关文章