(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)

図2●DBMSとの永続的接続(パーシステント・コネクト)
DBMSへのログインは負荷が高い処理であり,アクセスのたびにログインを行なっていては処理性能が低下する。PHPでは,処理後もDBMSとの接続を切断せず,再利用する永続的接続(パーシステント・コネクト)を備えており,性能を向上させるためにはこの機能をうまく利用する必要がある
図3●アクセラレータによる性能向上
中間言語に変換されたコードをキャッシュさせることで処理性能を向上させるツールも提供されている。Zend Performance Suiteのほか,無償で使用できるツールもある

JavaServer Pagesとの違いは「柔軟性」

 MicrosoftのASP(Acitve Server Pages)や,JSP(JavaServer Pages)も,HTML中に埋め込んだプログラムを実行することで,動的なWebページを生成する仕組みである。PHPとの違いは何だろうか。言語の文法が異なるのは当たり前だが,稼働環境や適用範囲にも大きな違いがある。

 ASPとの違いは,PHPはLinuxやUNIXなどオープンな環境で動作することだ。WindowsでもPHPは動作する。

 JSPも多くのOS上で動作するが,PHPには簡便さ,柔軟性というメリットがある。

 昨今のシステムは企画からリリースまでの期間がどんどん短くなっている。“3カ月稼働時代”とも言われる。

 厳密で多機能なプログラミング言語であるJavaは,屈強なクラス・ライブラリを作ってから,それをプロジェクトで利用していく開発方法をとることが多い。大規模開発に適していると言える。

 それに比べて制約が少ないスクリプト言語であるPHPは「まず動くものを作る」というプロジェクトの進め方に適性が高い。

 あるWebコンサルティング会社は,顧客の要件とおよそのイメージが出た時点で,1,2週間でPHPでほぼ完全なプロトタイプを制作するという。それで十分に議論を重ねる時間をとり,そのまま本番に上げてしまうこともあるし,要件に沿ってJavaなどのさらに性能の高いプラットフォームにアップグレードするという判断をしていく。

 この方法では,実際に画面のフローも決まるのでデザイン関連のタスクは2重にならない。またSQLなどは共通しているため,Javaに乗せかえるにしても非常にスムーズにことが運ぶのだという。このようなプロジェクトの進め方は,「柔軟性」という特徴をうまく利用しているといえる。

永続的接続やキャッシュで性能向上

 以下,PHPを利用する上でのポイントや注意点について見ていこう。

 PHPには性能向上を支援する様々な機能やツールがある。逆に言えば,これらを正しく使わなければ,PHPの性能を引き出すことはできない。

 昨今のブロードバンド環境は,Webサイトのパフォーマンスを要求する指標を「8秒ルール」から「4秒ルール」に変えてしまった。サービスが重厚でも,遅いサイトは容認されない。Webサイトの成功という観点において,パフォーマンスは非常に重要である。

 性能の向上のために重要なポイントにデータベース・サーバーとのコネクションがある。データベース・サーバーとのコネクションの生成にはCPUパワー,メモリーなどのリソースを多く消費する。Javaなどのシステムで用いられるコネクション・プーリングは,あらかじめ生成したデータベースとのコネクションをプールしておき,利用時にプールから取得することで生成コストを抑える手法だ。

 PHPには,より厳密な意味でのコネクション・プーリングはないが,同様の概念で性能を向上させる仕組みがある。「永続的接続(persistent connection)」と呼ばれるもので,PHPの設定ファイル(/etc/php.ini)により有効にできる。一般にコネクション・プーリングがWebサーバーのリクエストとは独立にデータベースのコネクションをプールするのに対し,永続的接続はWebサーバーのプロセスあるいはスレッドごとにデータベースへの接続を保持する(図2[拡大表示])。

 例えば,Apacheでは,初期起動プロセス数,最大起動プロセス数などを指定できるが,この数がそのまま保持されるコネクション数となる。当然,すべてのWebリクエストでデータベースを利用するとは限らないので,使用しないコネクション分のプールのリソースは消費しない。データベース・サーバーがコネクション・タイムアウトの判断をした後の再接続などは,必要に応じて自動的に行われるので,プログラムは,接続時に永続的接続に対応した関数を使用するほかは,特にコネクションの持続性について考えなくてよい*8。これらの機能により性能を引き出すための注意点を挙げておこう。まず,php.iniで,利用データベースのpersistent connect機能を有効にする。そして,Apacheのプロセス起動マージンを最小限にするため,MinSpareServers,MaxSpareServers,StartServersの値を揃えておくこと。そして,Apacheの最大プロセス数を決めるMaxClientsは,データベースの最大接続数と同じか,やや少なめになるよう設定しておくと良い。そして,データベース・サーバーのコネクション・タイムアウトの値は,データベースへの接続頻度を十分考慮に入れた設定にすることだ。

 なお,PostgreSQL用のコネクション・プーリング・ツールとして,pgpool*9が開発されている。このソフトウエアにより,データベース接続のコストは下げられるものの,オーバーヘッドによってデータベースへの通常の処理の性能はいくらか犠牲になることも報告されている。

 きわめて高い負荷に対応するためのもう一歩進んだ手段として「中間コードのキャッシュ」という方法がある(図3[拡大表示])。PHPプログラムは,実行時にその都度Webサーバーに読み込まれ,PHP駆動モジュールに渡され,中間コード(バイト・コードとも言われる)に変換され,そしてコアのZend Engineと呼ばれるライブラリによって実行される。このプロセスがリクエストのたびに繰り返される。

 そこで,PHPを実行する際に変換される中間コードを,オンメモリーにキャッシュすることにより実行効率を上げるというツールがある。Zend Technologiesの提供するZend Performance Suiteなどがそれだ。Zendによれば,最大25倍性能が向上するという。

 同様なツールに英ionCube社のPHP Accelerator(PHPA)がある。無料で提供されているにもかかわらずZendの製品と同程度のパフォーマンスをあげることができるされており,前述した米Yahoo!でも採用されている*10。日本においてもサポートする企業や,導入するユーザーが出てきている。

岡田良太郎(おかだ・りょうたろう)氏

株式会社テックスタイル代表取締役
2002年2月に築地に設立したテックスタイル(http://techstyle.jp/)で,オープンソース関連技術を中心に,インターネットシステムの構築,運用に関するセキュリティ・コンサルティングを実施。同社は現在,「オープンソースビジネスレビュー(OSBR)」という情報サービスを展開している。E-Mailはriotaro@techstyle.jp

(次回に続く)