给php网站提速
文中采用的是Linux操作系统,Apache+PHP的网站构建方法。
代码优化
通常需要程式员要有好的编程习惯,尽量减少冗余代码的出现,现在也有好多工具能够完成这项功能,对于一般的html文档,用于减少冗余的减肥工具很多,而对于PHP程式来说这样的工具就不太多了,但是Zend Technologies的Zend Optimizer是一款很好的代码优化工具,能够免费从Zend Technologies的网站上获得。Zend Optimizer的使用方法也很简单,只要将下载的ZendOptimizer-1[1].0.0-PHP_4.0.4- Linux_glibc21-i386.tar.gz文档解压缩,将其中的ZendOptimizer.so文档拷贝到/usr/local/Zend/lib目录下,然后修改php.ini文档,在最后添加以下几行:
显示说明Zend Optimizer工作正常
zend_optimizer.optimization_level=15
zend_extension="/usr/local/ Zend/lib/ ZendOptimizer.so"
配置完成后重启Apache服务器,编写一段PHP程式:
<? Phpinfo(); ?> |
一般来说Zend Optimizer能将系统的效率提升30%~40%,这是用户最关心的。
压缩页面
HTTP1.1协议支持页面压缩传送,也就是说服务器把一个页面压缩传送到客户端,然后在客户端将页面解压缩再显示给客户。在服务器端有两种传输方式,一种是页面事先已压缩好了,传送时只要将压缩页面传送到客户端就行,这种适用于静态网页多的情况,但是对于大多数站点,动态页面比较多,这种方法不太适合,因为很多传到客户端的页面其实是没有的,是服务器接到客户端用户请求动态产生的,所以就需要每生成一个动态页面都要在传到客户端以前先打包压缩。从PHP的4.0.4版以后,能够在php.ini文档中增加一行配置“output_handler = ob_gzhandler”,这样每个动态生成的页面在传送到客户端之前都会进行压缩,但是根据PHP官方站点的说明,这个参数不能和“zlib.output_compression = on”参数同时使用,因为容易引起PHP工作不正常,另外他只能压缩PHP程式的动态生成的页面,对于大量的静态页面尤其是图像文档就不行了。但是mod_gzip模块为Apahe提供了将静态页面在传给客户端以前先压缩的功能,他的压缩比最大能到10,一般情况下能够到 3,也就是说网站的传输速率一下提高了三倍多。要想使用mod_gzip功能首先要下载mod_gzip.c或mod_gzip.so文档,假如下载的是.c文档还要用Apache带的工具将他转化为.so文档才能使用,方法是运行下面的命令:
-i -a mod_gzio.c
cp mod_foo.so/path/to/apache/libexec/mod_gzip.so
chmod 755/path/to/apache/libexec/mod_foo.so
系统会在/path/to/apache/ etc/httpd.conf中自动激活该模块,假如下载的是.so文档则要将该文档拷贝到相应的目录下,然后在httpd.conf文档中添加LoadModule gzip_module libexec/ mod_gzip.so,使模块生效。需要注意两点,第一,要想使用.so文档,Apache必须包含了mod_so模块(能够通过httpd -l命令来查询该模块是否生效);第二,假如下载的是.so文档,他是和Apache的版本有关的,要注意下载的版本和自己使用的Apache是否一致,假如是.c文档就没有这个问题。模块生效后还要对Apache进行相应的配置,需要在httpd.conf文档中加入一些参数:
◆mod_gzip_on Yes(模块是否生效)
◆mod_gzip_minimum_file_size 1002(最小压缩文档大小)
◆mod_gzip_maximum_file_size 0(最大压缩文档大小,0表示没有限制)
◆mod_gzip_maximum_inmem_size 60000(最大可占用内存)
◆mod_gzip_item_include file "..gif102SINA>DOUBLE_QUOTATION (以gif结尾的文档要压缩传送)
◆mod_gzip_item_include file ".txt102SINA>DOUBLE_QUOTATION
◆mod_gzip_item_include file ".html102SINA>DOUBLE_QUOTATION
◆mod_gzip_item_exclude file ".css102SINA>DOUBLE_QUOTATION
使用了压缩模块后,当用户访问站点时会在日志文档中记录相应的信息,比如“mod_gzip :OK In:file_length Out:gzipfile_length”,表示该页面传输中使用了gzip功能,输入文档、输出文档大小都有说明。
文档缓存
这种方法通常是针对PHP、PERL等CGI程式而言的,因为这些程式有一个一起的特征就是接到用户的请求后不是马上将结果返回给用户,而是经过解释器解释执行后将执行结果返回给客户,这期间通常都要涉及到数据库的访问。这样就会出现一个问题,当两个用户访问同一个页面时,系统将分别对两个请求进行操作,但事实上这两个操作可能是一模相同的,这样无形当中增加了系统的负担。所以通常的解决办法是在系统内存中开辟出一段空间,当用户第一次访问页面后将执行结果存放在该内存中,当有用户再一次访问该页面时,系统就将页面直接从内存中调出而无需重新解释执行,这段内存空间就叫缓存。现在流行的缓存管理程式有两个,一个是FastCGI,另一个是Zend Technologies公司的Zend Cache。FastCGI主要是针对Perl、C、C++等CGI脚本程式设计的,能够有效地利用内存作缓存,来自客户端的请求都会被传送到FastCGI应用服务程式,FastCGI处理用户的请求后将结果返回给用户。一般的CGI程式这时将结束进程自动退出,但是FastCGI进程继续保持,这时他在接到新的用户请求后不必建立新的进程,能够立即处理用户请求,也就是说CGI程式建立进程顺序执行然后退出,而FastCGI程式顺序执行并永远循环。
Zend Cache的管理界面
要想使用FastCGI首先要把FastCGI编译到Apache中,方法很简单,这里就不说明了,还要在http.conf文档里作配置:
AddHandler fastcgi-script .fcg .fcgi .fpl
Options ExecCGI Indexes Includes
这样FastCGI就能够正常工作了,下面是FastCGI程式员手册中的一段例子程式:
#!fcgi-savvy-perl use FCGI; # 初始化 # Initialization code = 0; # Response loop while (FCGI::accept >= 0) { #FastCGI建立循环体 print "Content-type:text/html "; #程式执行 print "<head><title>FastCGI Demo Page (perl) </title></head> "; print "<h1>FastCGI Demo Page (perl)</h1> "; print "This is coming from a FastCGI server. <BR> "; print "Running on <EM>publish152.internal.sina.com.cn </EM> to <EM></EM><BR> "; ++; print "This is connection number "; } |
FastCGI对Perl等CGI程式的功能很强大,但是他对PHP程式确是无能为力的,而且需要在编程时增加内容,也就是说他需要一些人为的因素才能发挥作用。相比之下Zend Technologies公司的Zend Cache针对PHP的缓存功能是很强大的,只要安装了该软件,程式员就像编写其他PHP程式相同,无需增加代码,就能够实现缓存功能,有利于系统升级,十分方便。他是个付费软件。他有缓存功能并能通过图像界面对其进行管理,其中:Cache Control页面,能够配置Zend Cache,显示其当前状态,还能启动和停止Zend Cache功能;Scripts页面,Zend Cache的内容,包括每个文档的状态,还能够根据点击次数和缓存占有大小选择文档;Benchmark页面,能够测试Zend Cache的缓存效果,并以图像方式给出显示,他测试的是每秒钟完成PHP请求的次数。
他的安装、验证方法和Zend Optimizer基本相同,这里不再多说!