PHP を使用する最大の利点は、速度が速いことです。一般に、PHP は常に Web コンテンツの動的な生成をサポートするのに十分な速度を持っていますが、多くの場合、PHP よりも高速な方法を見つけることさえ不可能です。ただし、大量のアクセス、高負荷のアプリケーション、制限された帯域幅、およびパフォーマンスのボトルネックを引き起こすその他のさまざまな要因に直面した場合は、PHP のパフォーマンスを向上させる方法を検討する必要があります。
1. コードの最適化
コードの最適化とは、単にクリーンで明確なコードを記述するだけではなく、コードをある程度単純化することも意味します。 Zend Optimizer を使用すると、これらの面倒なタスクを自動的に完了できます。 Zend Optimizer は、Zend Technologies の Web サイト http://www.zend.com/ から無料で入手できますが、GPL に基づいて配布されていないため、ライセンス契約に同意する必要があります。その原理はシンプルで、Zend エンジンによって生成された中間コードを検出し、それを最適化することでより高い実行速度を実現します。
Zend Optimizer を使用すると、複雑な PHP ソース プログラムの実行効率がすぐに大幅に向上します。欠点は、最適化されたコードの可読性が低下し、コードの修正が困難になることです。
Zend Optimizer のインストール方法は非常に簡単で、ユーザーが使用しているプラットフォームに応じて適切なプリコンパイル済みバージョンをダウンロードし、次の 2 行のコードを php.ini ファイルに追加して、Web サーバーを再起動するだけです。その他の追加 zend_loader を無効にすると最適化が速くなるため、コードの 3 行目はオプションです。 zend_loader は、Zend Encoder Runtime が使用されていない場合にのみ無効にできることに注意してください。
2. キャッシュを使用するPHP プログラムのサイズが大きい場合、速度を向上させる方法はキャッシュを使用することです。 Zend Cache、APC、Afterburner Cache など、利用可能なキャッシュ ソリューションが多数あります。
上記はすべて「キャッシュモジュール」です。初めて PHP ファイルが呼び出されるとき、キャッシュ モジュールは PHP ソース コードから中間コードを生成し、これらの中間コードを Web サーバーのメモリに保存します。これらのファイルを後で呼び出すと、メモリ内の「コンパイルされた」コードを直接使用できます。この方法では、ディスク アクセスが最小限に抑えられ (コードが読み取られて解析されている)、コードがメモリ内で直接実行されるため、サーバーがリクエストに非常に速く応答できるようになるため、アプリケーションのパフォーマンスが大幅に向上します。
もちろん、キャッシュ モジュールは PHP ソース ファイルの変更も監視し、必要に応じてページを再キャッシュして、古い PHP コードによって生成されたページをユーザーが取得するのを防ぎます。キャッシュ モジュールはサーバーの負荷を大幅に軽減し、PHP アプリケーションの応答効率を向上させることができるため、負荷の高い Web サイトに非常に適しています。
Zend Cache は、Zend Technologies によって開発された商用ソフトウェアです。最初の実行後、PHP ページの実行速度はすぐに大幅に向上し、サーバーの空きリソースが増加します。欠点は無料ではないことですが、価格/パフォーマンスの比率は依然として非常に高いです。
Afterburner Cache は、Bware Technologies によって開発された無料のキャッシュ モジュールです。機能は基本的には Zend Cache と同じですが、パフォーマンスの向上という点では Zend Cache には及びません。
APC (Alternative PHP Cache) は、Community Connect によって開発されたもう 1 つの無料のキャッシュ モジュールです。現在のバージョンは 2.0.4 で、http://pecl.php.net/package/APC から入手できます。製品アプリケーションの場合、そのパフォーマンスは非常に安定しており、リクエストへの応答速度も大幅に向上します。
3. Web ページのコンテンツを圧縮するサイトのアクセス速度に影響を与えるもう 1 つの重要な要素が、ダウンロード速度です。解決策は、Web コンテンツを圧縮することです。プレーン テキスト コンテンツの場合、HTTP 圧縮テクノロジは元のサイズの 40% 未満に圧縮でき、データ転送を 60% 以上節約できます。 Web サーバーは圧縮により CPU 使用率をわずかに増加させますが、送信のためのネットワーク IO を大幅に節約できます。
IETF 仕様によれば、ほとんどのブラウザはコンテンツ圧縮に gzip 圧縮アルゴリズムの使用をサポートしています。つまり、gzip を使用して最初に Web ページのコンテンツを圧縮し、それをクライアントのブラウザーに送信すると、ブラウザーはデータを受信するときに自動的に解凍して、ページを表示します。このプロセスはユーザーに対して完全に透過的です。同様に、Web ページのコンテンツを圧縮するためのさまざまな方法があります。
Mod_gzip はオープンソースの標準 Apache モジュールであり、インターネット コンテンツ アクセラレーション モジュールとも呼ばれます。 Apache でコンパイルすることも、DSO として使用することもできます。通常のブラウジングプロセスと比較して、トラフィックを約 40% 節約できます。 Mod_gzip は、HTML や XML などの静的コンテンツを圧縮するだけでなく、SQL、Java、WML、VRML などの動的に生成されたコンテンツをサーバー側でリアルタイムに圧縮して送信することもでき、その圧縮効率は一般に驚くべきものです。 60%~85%。
動的 Web ページのコンテンツを圧縮するには、class.gzip を使用して .php ファイルをエンコードすることもできます。class.gzip は、PHP スクリプトの最初と最後でいくつかの関数を呼び出すことで、Web ページのコンテンツを圧縮します。サイト全体でこのような圧縮が必要な場合は、php.ini ファイルの auto_prepend および auto_append でこれらの関数を呼び出すことができますが、ある程度のシステム オーバーヘッドが発生します。
PHP4.0.4推出了1种新的输出缓冲的处理手段—ob_gzhandler,它的作用和class.gzip完全一样,区别是可以直接把它加到php.ini 文件中,语法如下:
<ol class="dp-c"><li class="alt"><span><span>output_handler = ob_gzhandler; </span></span></li></ol>
这样将激活PHP的输出缓冲功能,并在发送内容前进行压缩。如果不想在这里设置,只在需要的地方才改变这个默认设置(不压缩),只要在需要压缩的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(″ob_gzhandler″); </span></span></li></ol>
输出缓冲的效果确实很理想,并且不会为服务器带来额外的系统开销。要注意的一点是Netscape Communicator不支持图像的压缩。因此除非知道访问者都使用Internet Explorer,否则必须禁止压缩jpeg和gif图象。
4 其它技巧
在编程时,使用一些小技巧也可以加快PHP的运行速度:
(1)用i+=1代替i=i+1,既符合c/c++的习惯,效率相对还更高。
(2)尽可能使用PHP内部函数。
(3)能使用单引号字符串时,尽量使用单引号字符串。单引号字符串的效率要高于双引号字符串。
(4)用foreach代替while遍历数组,foreach的效率明显高于while循环,而且不需要调用reset函数。