高速性が PHP の最大の利点であることは誰もが知っています。一般に、PHP は常に Web コンテンツの動的な生成をサポートするのに十分な速度を備えており、多くの場合、PHP よりも高速な方法を見つけることさえできません。
しかし、大量のトラフィック、高負荷のアプリケーション、制限された帯域幅、その他のパフォーマンスのボトルネックを引き起こすさまざまな要因に直面しなければならない場合、Web サイトの動作を改善するために何かできることはないかと自問するかもしれません。おそらく、非常に目立たない無料モジュールを追加するだけで、PHP アプリケーションのパフォーマンスと Web サーバーの応答速度が大幅に向上するでしょう。
この記事では、PHP アプリケーションのパフォーマンスをさらに向上させ、ユーザーにより良いブラウジング エクスペリエンスを提供する方法について説明します。この記事では、PHP アプリケーションのパフォーマンスを向上させるためのさまざまなテクノロジーをコードの最適化、キャッシュ、コンテンツの圧縮の 3 つの側面から説明し、さまざまな分野でよく知られている製品を紹介します。
コードの最適化
まず、コードの最適化について見てみましょう。ここでのコードの最適化は、コードをより美しくすることを意味するものではないことに注意してください。これはおそらくすでに知られており、これ以上議論する必要はないためです。また、速度の問題をすでに考慮している場合は、すでに検討している可能性があります。 PHP ソース コードに変更を加え、いくつかの最適化を行いました。
ただし、Zend Optimizer などの一部のツールは、これらの複雑なタスクを自動的に完了するのに役立ちます。 Zend Optimizer は Zend Technologies から無料で入手できますが、ライセンス契約に同意する必要があり、GPL に基づいて配布されていないことに注意してください。 Zend Optimizer は、Zend Engine のランタイム コンパイルによって生成された中間コードを取得し、中間コードの実行効率が向上するように最適化します。
Zend Optimizer のインストール方法は非常に簡単で、使用しているプラットフォーム用に提供されているプリコンパイル済みバージョンをダウンロードし、次の 2 行のコードを php.ini に追加して、Web サーバーを再起動するだけです。
<ol class="dp-xml"> <li class="alt"><span><span class="attribute">zend_optimizer.optimization_level</span><span>=</span><span class="attribute-value">15</span><span> </span></span></li> <li> <span class="attribute">zend_extension</span><span>=</span><span class="attribute-value">"/path/to/ZendOptimizer.so"</span><span> </span> </li> <li class="alt"> <span class="attribute">zend_loader.enable</span><span>=</span><span class="attribute-value">Off</span><span> </span> </li> </ol>
キャッシュ
巨大な PHP アプリケーションのパフォーマンスを向上させたい場合は、キャッシュを使用することも良い方法です。 Zend Cache、APC、Afterburner Cache など、多くのキャッシュ ソリューションが利用可能です。
これらの製品はすべて「キャッシュモジュール」に属します。 .php ファイルに対するリクエストが最初に発生すると、Web サーバーのメモリに PHP 中間コードが保存され、その後のリクエストには「コンパイルされた」バージョンで応答します。この方法では、ディスク アクセスが最小限に抑えられ (コードが読み取られて解析されている)、コードがメモリ内で直接実行されるため、サーバーがリクエストに非常に速く応答できるようになるため、アプリケーションのパフォーマンスが大幅に向上します。 もちろん、キャッシュ モジュールは PHP ソース ファイルの変更も監視し、必要に応じてページを再キャッシュします。これにより、ユーザーが古い PHP コードによって生成されたページを取得するのを防ぎます。キャッシュ モジュールはサーバーの負荷を大幅に軽減し、PHP アプリケーションの応答効率を向上させることができるため、負荷の高い Web サイトでの使用に非常に適しています。これらのキャッシュ製品の選び方
Zend Cache は Zend Technologies の商用ソフトウェアであり、Zend Technologies は前述の PHP エンジンと無料の Zend Optimizer を提供する会社です。 Zend Cache は確かに当然の機能です。大規模な PHP ページの場合、最初の実行後に速度が向上し、サーバーで使用できるリソースが増えることが感じられます。残念ながら、この製品は無料ではありませんが、場合によっては、それでも十分な価値がある可能性があります。
Afterburner Cache は、Bware Technologies の無料のキャッシュ モジュールです。この製品は現在まだベータ版です。 Afterburner キャッシュは Zend Cache に似ていますが、(まだ) Zend Cache ほどパフォーマンスは向上せず、Zend Optimizer では動作しません。 APC は Alternative PHP Cache の略称で、Community Connect のもう 1 つの無料のキャッシュ モジュールです。すでに正式に使用できるほど安定した製品となっており、リクエストへの対応速度も大幅に向上するようだ。コンテンツ圧縮
先ほど、PHP アプリケーションのパフォーマンスを向上させるいくつかの方法について説明しました。Web サイトが遅すぎると感じるもう 1 つの重要な要素を見てみましょう。それは、ダウンロード速度です。 PHP アプリケーションが内部イントラネットで実行されており、各クライアントが 100 MB/秒でサーバーに接続している場合、ダウンロード速度は問題になりません。ただし、サーバーが低速モデム ユーザーにもサービスを提供する必要がある場合は、コンテンツの圧縮を検討する価値があります。
ほとんどのブラウザは、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)这个问题有望得到解决。在此之前,我们可以在网站的静态 部分使用mod_gzip。
然而有时我们确实需要压缩动态内容,所以必须找找其他办法。有一种办法是使用class.gzip_encode.php ,这是一个可以用来压缩页面内容的PHP类,具体方法是在PHP脚本的开头和末尾调用该类的某些函数。如果要 在网站级实现这个方案,可以从php.ini文件的auto_prepend以及auto_append指令调用这些函数。
这种方法虽 然有效,但它无疑为高负载的网站带来了更多的开销。关于如何使用这个类的详细说明,请参见它的源代码。 它的源代码说明相当完善,作者告诉了你所有你必须知道的事情。
PHP 4.0.4有一个新的输出缓存句柄ob_gzhandler,它与前面的类相似,但用法不同。使用 ob_gzhandler时要在php.ini中加入的内容如下:
<ol class="dp-c"><li class="alt"><span><span>output_handler = ob_gzhandler ; </span></span></li></ol>
这行代码使得PHP激活输出缓存,并压缩它发送出去的所有内容。如果由于某种原因你不想在php.ini中加上这行代码,你还可以通过PHP源文件所在目录的.htaccess文件改变默认的服务器行为(不压缩),语法如下 :
<ol class="dp-c"><li class="alt"><span><span>php_value output_handler ob_gzhandler </span></span></li></ol>
或者是从PHP代码调用,如下所示:
<ol class="dp-c"><li class="alt"><span><span>ob_start(</span><span class="string">"ob_gzhandler"</span><span>); </span></span></li></ol>
采用输出缓存句柄的方法确实非常有效,而且不会给服务器带来什么特殊的负荷。但必须注意的是,Netscape Communicator对压缩图形的支持不佳,因此除非你能够保证所有用户都使用IE浏览器,否则你 应该禁止压缩JPEG和GIF图形。一般地,对于所有其他文件,这种压缩都有效,但建议你针对各种浏览器都分别 进行测试,特别是当你使用了特殊的插件或者数据查看器时这一点尤其重要。
使用前面介绍的各种技术,你能够显著地改善网站的性能表现,但应该注意的是:
PHP可能是、也可能不是性能瓶颈所在。务必仔细地观察每一个和应用性能有关的因素,比如数据库等。
单纯使用本文技术只能在一定限度之内提高Web服务器的性能。因此在归咎于PHP以及它的缓存之前,不妨看看是否应该升级服务器以及是否可以引入负载平衡技术(后者需要较大的投资)。
不要低估内容压缩的作用。虽然你在100 MB/s的LAN连接下看到Web应用响应非常迅速,但使用Modem 连接的用户不会,他们只会抱怨你那100 Kb的HTML页面实在过于庞大。
希望通过本文对于PHP的介绍,能够给你带来帮助。