PHP のモジュールモードと CGI モードの速さの差は?



WordPress をはじめとする多くの CMS で利用されている PHP ですが、サーバー上で動作させるモードして、モジュールモード(モジュール版)CGI モード(CGI 版)の 2つがあります。

一般的に、モジュールモードを利用したほうがパフォーマンスは高いと言われていますが、実際のところはどの程度違うものなのでしょうか。

そこで、同じサーバー環境で、PHP をモジュールモードと CGI モードで切り替えて、そのパフォーマンスを比較してみたところ、なかなか興味深い結果になりました。



レンタルサーバーで利用可能なPHPのバージョンとモード比較(2017年6月)

PHPのパフォーマンスをベンチマークテストで比較【2017年版】(PHP Benchmark/PHPspeed)


モジュールモード(モジュール版)と 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 などがあります。

共用サーバーでモジュールモードを利用できるようにする仕組みは、各社でそれぞれ異なると思いますが、ロリポップ!では独自の技術を使ってセキュリティを保ちながらモジュールモードを使えるようにしたそうです。



ロリポップ!の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モジュールモード

※ロリポップ!の公式サイトより引用



そのため、負荷を高める意味で、テスト用の 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」(エックスサーバー系列で利用可能)を利用できるサーバーを選択するのがよさそうです。



レンタルサーバーで利用可能なPHPのバージョンとモード比較(2017年6月)

PHP7で表示速度は向上するか?PHP7とPHP5でWordPressの表示速度の変化を比較

PHPのパフォーマンスをベンチマークテストで比較【2017年版】(PHP Benchmark/PHPspeed)