WordPress をはじめとする多くの CMS で利用されている PHP ですが、サーバー上で動作させるモードして、モジュールモード(モジュール版)と CGI モード(CGI 版)の 2つがあります。
一般的に、モジュールモードを利用したほうがパフォーマンスは高いと言われていますが、実際のところはどの程度違うものなのかを調べるために、同じサーバー環境で、PHP をモジュールモードと CGI モードで切り替えて、そのパフォーマンスを比較してみました。
結果的には、以下のように興味深い結果となりました。
- 負荷が低い・処理量が少ない場合:「CGI モード」のほうがパフォーマンスは高い
- 負荷が高い・大量の処理を行う場合:「モジュールモード」のほうがパフォーマンスは高い
ここでは、モジュールモード(モジュール版)と CGI モード(CGI 版)の違いと、実際のパフォーマンスの比較について詳しく解説していきます。
モジュールモード(モジュール版)とCGIモード(CGI版)は何が違う?
PHP はプログラムを動作させるための言語の一つで、最もメジャーなものですが、その PHP を動作させる方法として、「モジュールモード」と 「CGI モード」の 2つがあります。
この 2つの違いを、ごく簡単にメジャーな Webサーバーソフトである Apache の機能で説明すると、以下のような感じに要約できます。
- モジュールモード:Apache の拡張機能で直接処理する方法
- CGI モード:Apache で直接処理せず、CGI プログラムを別途起動して処理する方法
一般的に、モジュールモードのほうが、CGI モードよりも高速だと言われています。CGI モードの場合、別途プログラムを起動して処理する必要があるため、その分動作が遅くなるため、モジュールモードのほうが CGI モードよりも高速に処理できます。
ただ、共用サーバーの場合は 1台のサーバーを複数人で共有しているため、セキュリティやメンテナンス上の理由から、直接 Apache に処理させないよう CGI モードを利用しているレンタルサーバーが多いです。
以下のサイトで、両社の違いを詳しく説明していますので、詳細を知りたい方は参照してみてください。
PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例
共用サーバーでもモジュールモードが利用できる
しかし、共用サーバーの中でもモジュールモードを使えるところはあります。当サイトで紹介しているレンタルサーバーの中では、ロリポップ!や heteml、WebARENA や mixhost などがあります。
共用サーバーでモジュールモードを利用できるようにする仕組みは、各社でそれぞれ異なると思いますが、ロリポップ!では独自の技術を使ってセキュリティを保ちながらモジュールモードを使えるようにしたそうです。
2. モジュール版PHPによるレスポンスの高速化
従来、共用サーバーでのモジュール版PHPの提供は、Apache権限でPHPが動作するために個々のユーザー領域の設定ができず、セキュリティに問題がありました。ロリポップ!では、独自に開発した権限分離アーキテクチャにより、大規模環境においてモジュール版PHPの高速性能を維持しつつ、安全に権限分離できる環境を構築。この技術は、パフォーマンス上におけるイノベーションの達成といえ、WordPressをはじめとしたモジュール版PHPで実行するプログラムでは、CGI版PHPに比べ大幅な速度改善が見込めます。これにより、圧倒的なコストパフォーマンスを誇るホスティングサービスの提供が可能となりました。
※ロリポップ!の公式サイトより引用
モジュールモードが利用できるようになったおかげで大幅なパフォーマンスの向上を実現したという、ロリポップ!の「エンタープライズプラン」を使って、実際に各モードのパフォーマンスをベンチマークテストで測定し、比較してみました。
2つの PHP モードによるベンチマークテスト
ロリポップ!の「スタンダードプラン」と「エンタープライズプラン」では、以下の PHP バージョンをコントロールパネル上から切り替えて利用することができます。(2016年4月時点)
- ver. 5.5.25(CGI モード)
- ver. 5.6.13(モジュールモード)
他のベンチマークテストでも利用した、テスト用の WordPress サイトを用いて、上記の二つのバージョンを切り替えて各種ベンチマークテストを行ってみます。
PHP Benchmark
まずは、PHP Benchmark からです。
このスクリプトは、PHP で簡単な計算などを行い、その処理にかかった時間を出力してくれます。パフォーマンスが高ければ処理時間が短くなるので、結果の数値がより小さいほうがパフォーマンスは高いと言えます。
ロリポップ!のコントロールパネルから PHP のバージョン設定を変更後、(切り替えに 5~10分くらいかかるため)10~15分くらい時間を空けたあとに、数回実行しました。(平日の日中に実施)
以下がその結果です。
(PHP Benchmark の詳しい説明や他のサーバーへの実施結果は、こちらの記事を参照してください)
テスト用 WordPress サイトでの PHP Benchmark の結果
最小値 | 最大値 | 12回の平均値 | 中間値の平均値 | 最大値と最小値の差 | |
CGIモード | 17 | 25 | 20 | 20 | 8 |
モジュールモード | 29 | 61 | 43 | 42 | 32 |
いずれの結果も、モジュールモードのほうが数値は大きくなりました。つまり、このテストでは、モジュールモードのほうが CGI モードよりパフォーマンスが悪いという結果が出てしまいました。
最大値と最小値の差も大きいので、「ブレ」もモジュールモードのほうが大きいということになります。
PHPspeed
次に、PHPspeed を実施しました。
このスクリプトは、PHP 単独で処理のみではなく、データの読み込み・書き込みやデータベースを絡めた処理のパフォーマンスなども測定します。結果の数字がより大きいほうがパフォーマンスは高いです。
こちらもバージョンの切り替え後に 10~15分くらいずつ空けて、数回実行しました。以下がその結果です。
(PHPspeed やテストの各項目などの詳しい説明と他のサーバーでの実施結果は、こちらの記事を参照してください)
テスト用 WordPress サイトでの PHPspeed の結果
Synthetic PHP BenchMark | Synthetic MySQL Test | Read/Write to File Test | Real World PHP Test | Real World PHP w/ MySQL Test | Server Benchmark | |
CGIモード | 11,094 | 4,289 | 4,992 | 13,814 | 7,826 | 5,036 |
モジュールモード | 5,603 | 4,526 | 2,186 | 7,782 | 2,724 | 3,311 |
こちらも全体的にモジュールモードのほうが数値は小さいため、パフォーマンスが低いということになってしまいます。
2つ目のテスト「Synthetic MySQL Test」の一部で、モジュールモードのほうが良い成績が出た時がありましたが、それを除くとほぼ全部の項目で、モジュールモードのほうがパフォーマンスは悪いという結果が出てしまいました。
ApacheBench
続いて ApacheBench です。
ApacheBench は、単一のファイルの処理に対する Webサーバーのパフォーマンスを測定します。様々な情報が出力されるのですが、その中で「1秒間に処理したリクエスト数(Requests per second)」を比較します。
同じ時間内により多くの処理をできているほうがパフォーマンスは高いので、「1秒間に処理したリクエスト数」の数字が大きいほうがパフォーマンスは高いことになります。
以下がその結果です。(ファイルは index.php を指定)
(ApacheBench の詳しい説明や他のサーバーへの実施結果は、こちらの記事を参照してください)
テスト用 WordPress サイトでの ApacheBench の結果
PHP モード | Requests per second |
CGIモード | 428.87 |
モジュールモード | 242.97 |
ApacheBench でも明らかな差で、CGI モードのほうが高いパフォーマンスを見せました。
ここまで、いずれのテストでも CGI モードのほうがパフォーマンスは高いという結果になってしまいました。はたして、「モジュールモードのほうがパフォーマンスは高い」というのは、嘘なのでしょうか?
条件を変えて測定した結果
そこで、今度はこれまでとは、条件を変えて結果に変化がみられるかを確認してみることにしました。
というのも、ロリポップ!のサイトには、モジュールモードの場合はサーバーの高負荷時に高速なレスポンスを返せる、という記述があります。
当社ベンチマークテストにおいて、モジュール版PHPでは約7倍(※)の高速化を実現しています。同時アクセス数が増加し、通常高負荷によるアクセス遅延が発生するような状況においても、高速なレスポンスを維持し続けます。この安定した高速レスポンスは、大規模サイトであればあるほど実感いただけます。※同時アクセス数が1,000の場合。
ベンチマークテスト計測方法
※ロリポップ!の公式サイトより引用
- WordPress 4.7 を使用
- CGI版、モジュール版ともにアクセス元、サーバーは同一
- 特定のPHPスクリプトに同時接続数による負荷をかける
- WordPressのトップページのレスポンスにかかった時間を計測
そのため、負荷を高める意味で、テスト用の WordPress サイトの文字数を大幅に増やしたものを作成し(最初のサイトは約 2,500文字、もう一つのサイトは約 37,000文字)、そちらでも ApacheBench を実施してみました。
文字数を大幅に増やした WordPress サイトでの ApacheBench の結果
PHP モード | 文字数増 | 文字数少 | 差分 |
CGIモード | 446.44 | 428.87 | -17.57 |
モジュールモード | 426.47 | 242.97 | +183.5 |
すると、CGIモードの数値が若干下がったのに対し、モジュールモードではぐんとパフォーマンスが上がりました。
結果としては、CGI モードの結果と比べると、まだ若干 CGI モードのほうが数値は高いのですが、文字数の少ないサイトにおける結果よりもずっと差が縮まりました。
やはり、負荷が高い場合には、モジュールモードの真価が発揮されるというのは間違いないようです。ロリポップ!のように、人気があって、夜間帯の負荷が高まりやすい傾向があるサーバーでは、モジュールモードは非常に効果的かもしれません。
PHP のモジュールモードと CGI モードの速さの違いまとめ
以上のように、なぜかほとんどすべてのテストで、CGI モードのほうがパフォーマンスがよいという結果が出てしまいました。
ただ、最後に実施した、負荷が高めた状況での ApacheBench のテストでは、モジュールモードのパフォーマンスがグンと向上し、安定感がある結果が見られました。
そのため、少ない処理の場合は CGI モードのほうがパフォーマンスは高く、大量の処理を行う場合にはモジュールモードが力を発揮するという、ロリポップ!の公式サイトの情報は正しかったと言えます。
当サイトで実施しているベンチマークテストは、サーバーに影響を与えすぎないようなレベルで実施しています。また、サーバーの契約後、すぐにテストを実施しているため、サーバーに同居している他のユーザーの利用状況もぼちぼちといったところですから、サーバー全体の負荷も、まだ低い状況でしょう。
さらに、ApacheBench は、単一の HTML ファイルに対する処理しかできません。実際にサイトを閲覧する際には、土台になる HTML ファイルに加え、多くの画像や広告、動画なども読み込まれますので、もっと負荷が高い処理が必要になります。
逆に、同じサーバーでの運用履歴が長くなれば、他のユーザーの影響から、サーバー全体の負荷ももっと高まります。
そのため、実環境では、サーバーの負荷が高い状況で、より高いパフォーマンスを発揮できる「モジュールモード」を使ったほうがいい、と言えます。もしくは、モジュールモードと同等のパフォーマンスを出せる「FastCGI」(エックスサーバー系列で利用可能)を利用できるサーバーを選択するのがよさそうです。