### 提升 PHP 执行速度全攻略(下)

Web 内容的压缩(令你客户用起来更“爽”)

经过以上两个的方法，相信你的 PHP 应用的性能已经得到了很大的提高，现在该从另一个方面来考虑了：下载速度。如果你的应用只是在公司内跑，所有的客户都使用 100Mb/s 的以太网连接到服务器，这可能不是一个问题，但是如果你的客户中有使用慢速的 modem 连接的，你就要考虑使用内容压缩这个方法了。根据 IETF 的规范，大多数的浏览器都支持 gzip 的内

容压缩。这意味着你在将 web 的内容发给客户的浏览器前，可以先使用 gzip 进行压缩，浏览器在接收的时候就会自动解压数据，并且令用户看到原来的页面。同样，压缩 web 页面的内容也有几个不同的方法。

mod_gzip 是 Remote Communications(http://www.phpbuilder.com/columns/www.remotecommunications.com)免费提供的一个 Apache 模块，它可以压缩静态的 web 页面。它工作得很好，你只需要将它和 apache 一起编译就行了(或者将它作为一个 DSO 使用)。Remotecommunications 的人说它还可以压缩动态的内容，包括 mod_php, mod_perl 等。不过我尝试了一下，看来并不行。我在 mod_gzip 的邮件列表中了解到，这个 bug 将在下一个版本中修正(我想应该是 1.3.14.6f 版本)。不过你仍然可以用它作静态内容的压缩。

不过我们还想压缩动态的内容，因此我们必须找另外的办法。一个办法是使用 class.gzip encode.php(http://leknor.com/code/)，只要在你的 PHP 脚本中的开头和结尾调用这个 PHP 类，就可以压缩你的页面内容。如果整个站点都需要这样的压缩，你可以在你的 php.ini 文件中的 auto_prepend 和 auto_append 中调用这些函数。它工作得很好，不过在负载很重的站点上，它明显会带来一点的系统开销。要详细了解它是如何工作的，可以看一下它的类代码(你至少需要在编译 PHP 时加入 zlib 支持)。作者在里面的说明也非常详细，你可以得到任何需要了解的东西。

在最近，我也看到了一篇关于 PHP 输出缓冲的文章。它说的是 PHP4.0.4 推出了一种新的输出缓冲的处理手段--ob_gzhandler，它的作用和上面介绍的类相同，但区别是你只要在你的 php.ini 中使用以下的句法就行了：

output_handler = ob_gzhandler ;

这样将激活 PHP 的输出缓冲功能，并且压缩所有它发送的东西。出于某些特别的原因，如果你不想在这里设置的话，只在需要的地方才改变这个默认设置的话(不压缩)，只要在需要压缩的 PHP 源码目录中，修改一下.htaccess 文件就行了，使用的句法如下：

php_value output_handler ob_gzhandler

...或者直接在你的 PHP 代码中调用它，以下面的方式：

ob_start("ob_gzhandler");

这个输出缓冲处理的方法很好，并且不会为服务器带来额外的系统开销。我十分建议你使用这种方法。它的改变可以用以下的例子说明，如果客户使用的是 28.8K 的 modem 的话，经过这个处理，他将会认为突然间换成了一个 ISDN 接入一样。要注意的一点是：Netscape Communicator 并不支持图象的压缩，所以将显示不出来。因此除非你的客户全部使用 Internet Explorer，否则你必须禁止压缩 jpeg 和 gif 图象。其它文件的压缩应该没有问题，但是我建议你最好测试一下，特别是浏览器使用了不常见的插件或者是少人用的浏览器。

其它有用的东西...

Zend Technologies 的在线商店在今年 1 月 24 开通了，并且售卖一些与 PHP 相关的有趣产品。包括前面提到的 Zend Cache，Zend Encoder(简单说来，是 PHP 代码的编译器，可以产生编译的类，这样你就可以售卖给顾客而不用担心泄露源代码。在需要运行这些类的 web 服务器上，将要使用 Zend Encoder Runtime 来解码)，Zend Ide(一个为 PHP 而设的集成化开发环境，带有很多强大的性能)，还有为 PHP 开发者提供的支持服务。

结论

使用这篇文章提到的技术，你将可以极大地提高站点的性能，不过请注意以下几点：

1.瓶颈或许不在 PHP，你需要考察应用中的每个对象(例如数据库)

2.一个 web 服务器的性能都是有限制的，因此，不要认为性能不好就是 PHP 的原因，也可能是访问量很大，你的服务器需要升级了，或者考虑使用负载均衡的系统(将会花很多钱)

3.不要认为内容压缩不重要，在 100Mb/s 的局域网中，你的 PHP 应用或许性能很好，但要考虑到使用慢速 modem 的用户。