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文件存在时才记录脚本运行文件。 这样一来能极大地方便线上脚本运行效率的监控。
今天用着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是我开发的一套unix/linux/mac下的动态域名方案。这是一个dnspod.com的API的客端.用户只需要配置/etc /podclientd.conf这个配置文件,即可随时更新dnspod上的ip信息.[这个项目一没有高性能,二也不功能强大...,就是方便实用吧.] 项目托管在http://code.google.com/p/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 [请将#换成@]
近来由于业务量急剧增长,业务种类越来越多,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扩展). 因此,我忙活了半天,最后得出的结论是,目前还不能在公司大规模加以运用。 但是对于小型企业,创业型公司来说,这种效率对比还是很有用的,可以加以挖掘。
我的师兄,从某种程度上说也是我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/
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/
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/
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/
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)
,再另外一个:
//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得到了这个结果.
两段代码,都是用来1到100之前计算三次方的. 同样的代码,第一个其实只需要一行(当然要考虑美观,分成了四行); 第二个估计要用上100来行;但是哪个更快呢?…. 读者说哪个程序更好? 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]; }
前面几篇文章提到了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服务器的某个目录下,用浏览器访问,这会显示当前的状态.我们可以从这里的表格分析当前的缓存状况,作出进一步优化. 这是某test站点的状态.您可以慢慢分析,这个工具会提供很多有用的工具.比如您可以看到哪些文件经常被包含(访问),您缓存的哪个变量经常被读取,或经常被更新等. 最后顺便提一句,有独立报告说,APC的代码缓存、优化效果要高出zend优化器.就算不是真的,他开源而又免费,实在是一个相当不错的选择.
phpfox是国外的一款社区软件,具有论坛,博客,相册,音乐,投票,问答,视频等功能,基于php,mysql.安装需要gd库的支持。
我拿到程序后修改的第一步:
1.修改用户接口部分。 phpfox是典型的单入口型程序和类MVC架构。具体怎么改我不加描述了,只提一下,因为phpfox把对几乎所有路径的访问全部rewrite到了index.php,所以要在.htaccess文件中加上这样的两行: Rewritecond %{REQUEST_FILENAME} !-f 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$.
修改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编译结果缓存起来,另外把图片等静态文件进行了分流)。
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性能的影响。