### 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 基本相同，这里就不详细说明了，感兴趣的读者可以参考用户手册，它的强大功能和便利的管理方法确实让人心动。
以上是网站提速常见的几种方法，对于不同的网站需要采用不同的手段，所对应的提速方案也不尽相同，但总体上不外乎是以上提到的三招，读者可以根据自己的实际情况具体问题具体分析。
注意：考虑到客户端软件的复杂性，因为有些客户端软件可能不支持某些特性，比如，mod_gzip 对页面进行压缩，但是如果客户端使用的是 Netscape 就不行，因为它不能把接收到的压缩页面解压缩，导致页面不能正常显示。