我们都知道,速度快是PHP最大的优点。一般情况下PHP总是具有足够的速度支持Web内容动态生成,许多时候你甚至无法找出比它更快的方法。
然而,当你不得不面对庞大的访问量、高负荷的应用、有限的带宽以及 其他各种带来性能瓶颈的因素时,你可能会问问自己是否可以做点什么让网站运行得更好。或许只要加上一个 很不起眼的免费模块,你的PHP应用性能以及Web服务器响应速度就会有显著的改善。
本文讨论的就是如何进一 步提高php应用的性能,给用户以更美妙的浏览感受。本文分三个方面(代码优化、缓存、内容压缩)阐述提高 PHP应用性能的各种技术,并介绍各个领域的知名产品。
代码优化
首先我们来看看代码优化。注意,这里的代码优化可不是指把代码写得更加美观漂亮,因为这恐怕已经是 众所周知没有必要继续讨论了;另外,如果你已经考虑到了速度问题,很可能你早就对PHP的源代码作了一些优化。
不过,有些工具却能够自动地帮助我们完成这些繁杂的工作,如Zend Optimizer就是这样一个工具。 Zend Optimizer可以从Zend Technologies免费得到,但你必须同意它的许可约定,注意它不是以 GPL方式发行。Zend Optimizer获取由Zend Engine运行时编译生成的中间代码,并对它进行优化, 从而使得中间代码具有更快的执行效率。
Zend Optimizer的安装方法非常简单,你只需下载为自己所用平台提供的预编译版本,把下面两行代 码加入到php.ini,然后重新启动Web服务器即可:
zend_optimizer.optimization_level=15
zend_extension="/path/to/ZendOptimizer.so"
zend_loader.enable=Off
这里额外增加的第三行代码是可选的。禁止zend_loader似乎能够让Zend Optimizer的速度更快一点 ,所以在php.ini中加上这行代码是值得的。注意:只有当你不使用Zend Encoder Runtime时,你才 可以禁用zend_loader。
缓存
如果你想要让自己庞大的PHP应用有更好的性能表现,采用缓存也是一种很好的方法。现在已经有许多缓存 方案可供选择,其中包括:Zend Cache,APC,和Afterburner Cache。
所有这些产品都属于“缓存模块”。当第一次出现对.php文件的请求时,它们会在Web服务器内存中保存 PHP的中间代码,此后就用“经过编译”的版本响应后继的请求。这种方法确实能够改善应用的性能,因为它使 得磁盘访问量减低到了最少的程度(代码已经读取和解析),代码直接在内存中运行使得服务器响应请求的速度大大提高。
当然,缓存模块还会监视PHP源文件的变化,必要时重新缓存页面,从而防止了用户得到的页面仍 旧由过时的PHP代码生成。由于缓存模块能够明显地降低服务器的负载、提高PHP应用的响应效率,因此它们非 常适合于负载较大的网站使用。
如何选择这些缓存产品
Zend Cache是Zend Technologies公司的商业软件,而Zend Technologies就是前面提到的 那个为我们提供PHP引擎和免费Zend Optimizer的公司。Zend Cache确实是名不虚传!对于大型的 PHP页面,你可以感觉到第一次运行之后速度就会有所提高,而且服务器也会有更多的可用资源。遗憾的是这个 产品并不免费,不过在有些情形下它仍旧是物超所值。
Afterburner Cache是来自Bware Technologies的免费缓存模块,当前这个产品还是Beta版。 Afterburner Cache的做法看起来与Zend Cache差不多,但它对性能的改善程度(还)不能与 Zend Cache相比,而且它还不能与Zend Optimizer一起工作。
APC是Alternative PHP Cache的缩写,它是来自Community Connect的又一个免费缓存模 块。这个产品已经具有足够的稳定性供正式场合使用,而且它看起来也能在很大程度上提高响应请求的速度。
内容压缩
前面我们讨论了几种提高PHP应用性能的方法,下面来看看使得浏览者感到网站速度太慢的另外一个重要因 素:下载速度。如果PHP应用在内部Intranet上运行,而且每一台客户机都以100 MB/s的速度连接到服务 器,那么下载速度应该不是什么问题。然而,如果服务器还要为慢腾腾的Modem用户提供服务,那么值得考虑内 容压缩。
ほとんどのブラウザは、IETF 標準に準拠したコンテンツ圧縮の gzip をサポートしています。つまり、コンテンツを gzip 圧縮してブラウザに送信すると、ページが表示される前にデータが解凍され、プロセス全体がユーザーに対して完全に透過的になります。サーバー側のコンテンツ圧縮に関しては、さまざまな方法が利用可能です。
たとえば、Remote Communications の無料の Apache モジュール mod_gzip には、このタイプのコンテンツ エンコーディングをサポートするブラウザ向けに静的 Web コンテンツを圧縮する機能があります。静的 Web コンテンツの大部分では、mod_gzip が非常にうまく機能します。 mod_gzip は Apache に簡単にコンパイルでき、DSO としても使用できます。 Remote Communications によると、mod_gzip は mod_php、mod_perl などの動的コンテンツも圧縮できます。
何度も試してみましたが、まだうまくいかないようです。 mod_gzip に関する多くのフォーラムや記事を読んだところ、この問題は mod_gzip の次のバージョン (おそらく 1.3.14.6f) で解決される予定のようです。それまでは、Web サイトの静的部分で mod_gzip を使用できます。
ただし、場合によっては動的コンテンツを本当に圧縮する必要があるため、他の方法を見つける必要があります。 1 つの方法は、class.gzip_encode.php を使用することです。これは、PHP スクリプトの最初と最後でクラスの特定の関数を呼び出すことによって、ページのコンテンツを圧縮するために使用できる PHP クラスです。このソリューションを Web サイト レベルで実装する場合は、php.ini ファイルの auto_prepend および auto_append ディレクティブからこれらの関数を呼び出すことができます。
この方法は効果的ですが、高負荷のウェブサイトでは間違いなくより多くのオーバーヘッドをもたらします。このクラスの使用方法の詳細については、そのソース コードを参照してください。 ソースコードの説明は非常に完全で、著者はあなたが知る必要があるすべてを教えてくれます。
PHP 4.0.4 には新しい出力キャッシュ ハンドラー ob_gzhandler があり、以前のクラスに似ていますが、その使用法は異なります。 ob_gzhandlerを利用する際にphp.iniに追加する内容は以下の通りです
output_handler = ob_gzhandler;
このコード行により、PHP は出力キャッシュを有効にし、送信するすべてのものを圧縮します。何らかの理由で、このコード行を php.ini に追加したくない場合は、PHP ソース ファイルが配置されているディレクトリ内の .htaccess ファイルを使用して、デフォルトのサーバー動作 (圧縮なし) を変更することもできます。は次のとおりです:
php_value Output_handler ob_gzhandler
または、以下に示すように、PHP コードから呼び出します。
ob_start("ob_gzhandler");出力キャッシュハンドルを使用する方法は確かに非常に効果的であり、サーバーに特別な負荷をもたらしません。ただし、Netscape Communicator では圧縮グラフィックのサポートが不十分であるため、すべてのユーザーが IE ブラウザを使用していることを保証できない限り、圧縮 JPEG および GIF グラフィックを無効にする必要があることに注意してください。一般に、この圧縮は他のすべてのファイルに対して機能しますが、特に特別なプラグインやデータ ビューアを使用する場合は、ブラウザごとに個別にテストすることをお勧めします。
前に紹介したさまざまなテクニックを使用すると、Web サイトのパフォーマンスを大幅に向上させることができますが、次の点に注意する必要があります。
PHP がパフォーマンスのボトルネックになる場合もあれば、そうでない場合もあります。データベースなど、アプリケーションのパフォーマンスに関連するあらゆる要素を注意深く観察してください。
この記事のテクノロジーを使用するだけでは、一定の制限内でのみ Web サーバーのパフォーマンスを向上させることができます。したがって、PHP とそのキャッシュを非難する前に、サーバーをアップグレードする必要があるかどうか、また負荷分散テクノロジを導入できるかどうかを検討したほうがよいでしょう (後者には多額の投資が必要です)。
コンテンツ圧縮の力を過小評価しないでください。 100 MB/秒の LAN 接続では Web アプリケーションが非常に高速に応答することがわかりますが、モデム接続を使用しているユーザーは、100 Kb の HTML ページが大きすぎると不満を言うだけです。
この記事の PHP 入門がお役に立てば幸いです。
http://www.bkjia.com/PHPjc/314845.html