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



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

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

同じサーバー環境で、PHP をモジュールモードと CGI モードで切り替えて、そのパフォーマンスを比較してみました。


モジュールモード(モジュール版)と CGI モード(CGI 版)とは?

PHP はプログラムを動作させるための言語の一つで、最もメジャーなものですが、その PHP を動作させる方法として、「モジュールモード」と 「CGI モード」の 2つがあります。

この 2つの違いを、メジャーな Webサーバーソフトである Apache を例としてごく簡単に説明すると、以下のような感じに要約できると思います。

モジュールモード:Apache の拡張機能で直接処理する方法
CGI モード:Apache で直接処理せず、CGI プログラムを別途起動して処理する方法

一般的に、モジュールモードのほうが、CGI モードよりも高速だと言われています。モジュールモードが CGI モードよりも高速に処理できるのは、CGI モードの場合、別途プログラムを起動して処理する必要があるため、動作が遅くなるからです。

ただ、共用サーバーの場合は 1台のサーバーを複数人で共有しているため、セキュリティやメンテナンス上の理由から、直接 Apache に処理させないよう CGI モードを利用しているレンタルサーバーが多いです。

以下のサイトで、両社の違いを詳しく説明していますので、詳細を知りたい方は参照してみてください。

PHP における「モジュール版」と「CGI 版」の比較 + WordPress の適用例


共用サーバーでもモジュールモードが利用できる

しかし、共用サーバーの中でもモジュールモードを使えるところはあります。当サイトで紹介しているレンタルサーバーの中では、ロリポップや WebARENA などがあります。

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

モジュールモードが利用できるようになったおかげで大幅なパフォーマンスの向上を実現したという、そのロリポップの「エンタープライズプラン」を使って、実際にそれぞれのモードのパフォーマンスをベンチマークテストで測定し、比較してみました。

ロリポップのPHPモジュールモード
(ロリポップの公式サイトより)

2つの PHP モードによるベンチマークテスト

ロリポップの「スタンダードプラン」と「エンタープライズプラン」では、以下の PHP バージョンをコントロールパネル上から切り替えて利用することができます。(2016年4月時点)

・ver. 5.5.25(CGI モード)
・ver. 5.6.13(モジュールモード)

他のベンチマークテストでも利用した、テスト用の WordPress サイトを用いて、上記の二つのバージョンを切り替えて各種ベンチマークテストを行ってみます。


PHP Benchmark

まずは、PHP Benchmark からです。

このスクリプトは、PHP で簡単な計算などを行い、その処理にかかった時間を出力してくれます。パフォーマンスが高いほうが処理時間が短いので、結果の数値がより小さいほうがパフォーマンスが高いといえます。

PHP Benchmark の詳しい説明や他のサーバーへの実施結果は、こちらの記事を参照してください。

ロリポップのコントロールパネルから PHP のバージョン設定を変更後、切り替えに 5~10分くらいかかるようなので、平日に 10~15分くらいずつ空けて、数回実行しました。

以下がその結果です。


PHP モード 最小値 最大値 12回の平均値 中間値の平均値 最大値と最小値の差
CGIモード 17 28 22 22 11
モジュールモード 28 50 40 40 22
CGIモード 17 26 20 20 9
モジュールモード 35 69 51 50 34
CGIモード 18 22 19 19 4
モジュールモード 23 64 38 37 41



交互に実施しているので、少しわかりにくいかもしれませんが、いずれの結果もモジュールモードのほうが数値が大きいです。つまり、このテストでは、モジュールモードのほうが CGI モードよりパフォーマンスが悪いという結果が出てしまいました。

最大値と最小値の差も大きいので、ブレも大きいということですね。


PHPspeed

次に、PHPspeed を実施しました。

このスクリプトは、PHP 単独で処理のみではなく、データの読み込み・書き込みや MySQL などのデータベースを絡めた処理のパフォーマンスなども測定します。結果の数字がより大きいほうがパフォーマンスが高いです。

PHPspeed やテストの各項目などの詳しい説明と他のサーバーでの実施結果は、こちらの記事を参照してください。

こちらも切り替え後に 10~15分くらいずつ空けて、数回実行しました。以下がその結果です。


PHP モード 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,053 3,667 4,809 13,685 7,507 5,172
モジュールモード 5,538 4,495 2,305 10,961 2,719 4,112
CGIモード 10,990 5,026 5,285 13,085 7,354 5,209
モジュールモード 5,845 4,792 2,261 6,001 2,790 2,803
CGIモード 11,240 4,173 4,883 14,671 8,618 4,727
モジュールモード 5,425 4,291 1,992 6,383 2,662 3,017



こちらも交互に実施していますが、全体的にモジュールモードのほうが数値が小さいです。2つ目のテスト「Synthetic MySQL Test」の一部でモジュールモードのほうが高い数値が出ているところがありますが、こちらもほぼ全部の項目でモジュールモードのほうがパフォーマンスが悪いという結果が出てしまいました。


ApacheBench

続いて ApacheBench です。

ApacheBench は、単一のファイルの処理に対する Webサーバーのパフォーマンスを測定します。様々な情報が出力されるのですが、その中で「1秒間に処理したリクエスト数(Requests per second)」を比較します。

パフォーマンスが高いほうが処理を多くできていることになるため、「1秒間に処理したリクエスト数」の数字が大きいほうがパフォーマンスが高いです。

ApacheBench の詳しい説明や他のサーバーへの実施結果は、こちらの記事を参照してください。

以下がその結果です。(ファイルは index.php を指定)


テスト用 WordPress サイトでの ApacheBench の結果
PHP モード Requests per second
CGIモード 415.07
モジュールモード 224.42
CGIモード 442.67
モジュールモード 261.52

こちらも明らかな差で、CGI モードのほうが高いパフォーマンスを見せました。

ここまで、いずれのテストでも CGI モードのほうがパフォーマンスが高いという結果になってしまいました。そこで、少し条件を変えて変化がみられるかを確認してみることにしました。

ロリポップのサイトには、モジュールモードの場合はサーバーの高負荷時に高速なレスポンスを返せる、と記載があります。

ロリポップのPHPモジュールモード
(ロリポップの公式サイトより)

そのため負荷を高める意味で、WordPress のサイトの文字数を大幅に増やしたものを作成し(最初のサイトは約 2,500文字、もう一つのサイトは約 37,000文字)、そちらでも ApacheBench を実施してみました。


文字数を大幅に増やした WordPress サイトでの ApacheBench の結果
PHP モード Requests per second
CGIモード 455.39
モジュールモード 429.13
CGIモード 437.48
モジュールモード 423.81



すると、こちらのテストでは、元のテスト用サイトに対する結果よりも、逆にパフォーマンスが上がりました。CGI モードの結果と比べると、まだ若干 CGI モードのほうが数値は高いのですが、前の結果よりもずっと差が縮まりました。


PHP のモジュールモードと CGI モードの速さの違いまとめ

以上のように、なぜかほとんどすべてのテストで、CGI モードのほうがパフォーマンスがよいという結果が出てしまいました。

ただ、最後に実施した ApacheBench でのテストでは、サイズの大きいファイルの処理では、サイズの小さいファイルよりも逆にパフォーマンスが向上し、安定感を見せました。そのため、少ない処理の場合は CGI モードのほうがパフォーマンスがよく、大量の処理を行う場合にはモジュールモードが力を発揮するのかもしれません。

基本的にはいずれのベンチマークテストもサーバーにあまり負荷を与えすぎないよう、ほどほどの影響にとどまるようなレベルで実施しています。また、ApacheBench は、単一のファイルに対する処理しかできません。実際にサイトを閲覧する際には、土台になるファイルに加え、多くの画像や時には動画なども読み込まれますので、もっと負荷が高い処理が必要になります。

あくまで推測にすぎませんが、そういう意味では、負荷が高いほうがよりパフォーマンスを発揮できるモジュールモードのほうが、実環境で高いパフォーマンスを発揮できるのかもしれません。

当サイトで現在紹介しているレンタルサーバーの中では、PHP モードの切り替えが可能なレンタルサーバーはロリポップしかなかったため、今回はロリポップでの結果だけでしたが、また機会があれば他社でもテストを実施してみたいと思います。