»
S
I
D
E
B
A
R
«
PHP版的slow-query
Nov 4th, 2009 by 一米六二

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注释查看器
Jun 8th, 2009 by 一米六二

今天用着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
May 27th, 2009 by 一米六二

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  [请将#换成@]

用fastCGI协议进行RPC调用
Dec 6th, 2007 by 一米六二

近来由于业务量急剧增长,业务种类越来越多,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来做性能测评好像不公平吧?
Aug 21st, 2007 by 一米六二

我的师兄,从某种程度上说也是我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程序进行性能测评.
另外,有空见到这两位兄台,好好争论一番.

老覃的性能测试
Aug 21st, 2007 by 一米六二

老覃同学做了一个测试,来比较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得到了这个结果.

聪明人的算法
Aug 15th, 2007 by 一米六二

两段代码,都是用来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];
}

php-APC介绍
Aug 14th, 2007 by 一米六二

前面几篇文章提到了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优化器.就算不是真的,他开源而又免费,实在是一个相当不错的选择.

phpfox全攻略
Aug 13th, 2007 by 一米六二

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$.

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

PHP 装上APC之后的问题:
Jul 26th, 2007 by 一米六二

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性能的影响。

»  Substance: WordPress   »  Style: Ahren Ahimsa
29479 页面访问次数, 561 今天
11361 访问数, 178 今天
FireStats icon 由FireStats提供支持