.NET開発者のためのブログメディア
PHPモジュールモードとCGIモードについて違いなどを詳しく解説!

- SE
- PHPモジュールモードとCGIモードについて違いについて教えてください。
- PM
- では、基本的な違いについて解説していきます。
目次
PHPモジュールモードとCGIモードについて
WebサーバーでPHPを実行する方法には主に、以下の2つの方法があります。
・PHPモジュールモード
・CGIモード
PHPモジュールモードとは、WebサーバーのプロセスのなかでPHPを実行する方法のことを言います。この実行方法と相対するものとしてCGIモードというものがあります。
今回はこの2つの概要と、違いを書いていきます。
PHPモジュールモードとは
WebサーバーのプロセスのなかでPHPを実行する方法のことを言います。
ここでいうWebサーバーは、ApacheというWebサーバーソフトウェアのことです。Apacheは世界中で使用されていて、多くのレンタルサーバーがApacheで動いています。そのため、一般的にPHPのモジュールモードはApacheのモジュール版のことを言います。
モジュールモードの特徴
・Rootユーザー権限でPHPが実行される
・他のユーザーのファイルを参照することができてしまう
・Webサーバーのプロセスの中で実行される
Rootユーザー権限でPHPが実行される
PHPモジュールモードでは、PHPの実行はRootユーザーが実行します。
まず、ユーザーがWebページを参照するとき、Webサーバーにアクセスします。PHPモジュールモードのWebサーバーでは、アクセスがあるとRootユーザーがPHPファイルを探し、実行します。
しかし、Rootユーザーが実行するため、セキュリティ面での不安要素があります。それは次に記述する「他のユーザーのファイルを参照することができてしまう」ことです。
他のユーザーのファイルを参照することができてしまう
PHPモジュールモードでは、RootユーザーがPHPファイルを探し、実行するため、同一Webサーバー内のユーザー間でのファイル干渉が可能です。
レンタルサーバーでは共用サーバーと言う、1つのWebサーバーを複数のユーザーが利用する利用形態があります。この利用形態で、モジュールモードでPHPを実行している場合、他のユーザーが他のユーザーのファイルを参照することができてしまいます。
これはセキュリティー面において問題であるため、共用サーバーではPHPモジュールモードは向いていないとされています。
そこで、PHPモジュールモードでは「セーフモード」という設定があり、これを適用すれば他のユーザーが自ユーザーのファイルを参照できなくすることができます。
ただ、この設定はメリットだけでなくWordPressの管理画面でファイル操作が行えないなど、一部使えない機能が発生します。
Webサーバーのプロセスの中で実行される
モジュールモードは、Apacheの拡張モジュールとして運用されます。そして、モジュールモードはWebサーバー(Apache)のプロセスの中で実行されるため、他の無駄なプロセスが立ち上がることがありません。
これにより、WordPressなどのWebサイトで表示高速化など、パフォーマンスの向上が見込めます。
CGIモードとは
CGI(Common Gateway Interface)とは、Webサーバー上でプログラムを実行する仕組みのことを言います。Webサーバー上でPHPをこの仕組みで実行することをCGIモードと言います。
CGI版の特徴
・それぞれのユーザー権限でPHPを実行する
・ディレクトリごとにPHPのバージョンなどを変えることができる
・Webサーバーとは別のプロセスとして実行される
それぞれのユーザー権限でPHPを実行する
それぞれのユーザー権限で実行するため、同一サーバー上の他のユーザーとのファイル干渉はありません。そのため、多くのレンタルサーバーではセキュリティーやメンテナンス上の理由から、CGIモードが利用されています。
ディレクトリごとにPHPのバージョンなどを変えることができる
CGIモードは、ディレクトリごとにPHPのバージョンを変えることができます。そのためには「.htaccess」という設定ファイルが必要になります。この設定ファイルをディレクトリごとに設置することで、PHPのバージョンをディレクトリごとに変更することができます。
また、「php.ini」ファイルというPHPの設定ファイルで動作環境を変えることができます。こちらもディレクトリごとの変更が可能です。
CGIモードでは、このようにディレクトリごとに「.htaccess」「php.ini」を設置することで、PHPのバージョン、動作環境を変えることができますが、以下のようなメリットがあります。
・PHPのバージョンアップ前に動作確認をしたい
―既存のシステムとは別のディレクトリに「.htaccess」で新しいPHPのバージョンを指定して動作確認ができます。
・使用したいソフトウェアが古いバージョンでないと動かない
―セキュリティの強化などがされている最新バージョンを常に使用したいですが、古いバージョンでないと動かないソフトウェアがあったとしても、別のディレクトリに古いバージョンを指定した「.htaccess」を設置してそこで動作させれば問題ありません。
.htaccessとは
Apacheの設定ファイルで、ディレクトリ単位でApache(Webサーバー)の設定をすることができます。適用範囲は設置したそのディレクトリ内と、その下層ディレクトリです。
Webサーバーとは別のプロセスとして実行される
CGIモードで実行すると、Webサーバーとは別のプロセスとして実行されます。PHPプログラムが実行されるたびにプロセスが1つ立ち上がることになります。
CGIモードの場合では、PHPスクリプトが呼ばれてからPHPの読み込みを行い、Webサーバーとは別プロセスとして実行するため処理速度が遅いです。
そこで、処理速度改善のために登場したのがFastCGIです。FastCGIは一度立ち上がったプロセスを終了させることなく保持することで、処理の高速化、負荷軽減を実現しています。
モジュールモードとCGIモードの違い
ここからは、本題のモジュールモードとCGIモードの違いについて記述していきます。上で挙げたそれぞれの特徴から違いを見つけ、どちらの方が優れているのか比べます。
まず、実行方法の違いからはCGIモードの方がセキュリティー面で優れています。実行プロセスの違いは、処理速度に影響があり、PHPモジュールモードの方が速いという結果が出ます。以下はその詳細になります。
実行方法の違い
PHPモジュールモードでは、PHPの実行はRootユーザーが実行するのに対し、CGIモードの場合は、それぞれのユーザー権限で実行します。このことから、セキュリティー面で違いが生まれます。
セキュリティーの違い
PHPモジュールモードでは、Rootユーザーが実行するためユーザー間でファイル干渉可能ですが、CGIモードの場合は、それぞれのユーザーで実行するためそのようなことがありません。
実行プロセスの違い
PHPモジュールモードでは、Apacheのプロセスの中で実行されます。CGIモードの場合は、Apacheとは別プロセスとして実行されるため、PHPプログラムが実行されるたびにプロセスが1つ立ち上がります。
速度の違い
CGIモードは、PHPプログラムの実行のたびにプロセスが立ち上がるためモジュールモードより速度が遅くなりがちです。FastCGIの場合は、モジュールモードとあまり変わらないようで、場合によってはFastCGIの方が速くなることがあるようです。
- SE
- つまり、実行速度とセキュリティー面での違いということでしょうか。
- PM
- そうですね。下記に確認方法を記載していますので、ぜひ覚えてください。
PHPモジュールモードについてのまとめ
PHPモジュールモードはApacheの拡張機能で、ApacheのプロセスとしてPHPを実行する方法です。そのため、Apacheとは別プロセスで動かすCGIモードよりも比較的速い処理速度が期待できます。
しかし、PHPモジュールモードはRootユーザーが実行するため、ユーザー間でのファイル干渉が可能です。これは各ユーザーで実行するCGIモードと比べセキュリティー面で劣る点です。そのため多くのレンタルサーバーではセキュリティーを考慮してCGIモードが採用されています。
最後に、PHPプログラムがモジュールモードで動いているのか、CGIモードで動いているのかを確認する方法を記述します。
1
|
< ?php phpinfo(); ? >
|
上記コードを記述したPHPファイルを用意し、Webサーバーにアップロードし、アクセスします。アクセスするとPHPのバージョンが表示された表のようなものが表示されるので、その表の中の「Server API」という項目を探してください。
その項目の値が、「Apache x.x Handler」や「Apache」となっていればPHPモジュールモードということになります。逆に「CGI/FastCGI」となっていればCGIモードということになります。
Search キーワード検索
Popular 人気の記事
-
【VB.NET入門】DataGridViewの使い方まとめ
公開: 更新:
reccomended おすすめ記事
-
【.NETが統合】.NET 5の概要と今後のリリース予定
公開: 更新:
Categories 連載一覧
Tags タグ一覧
Jobs 新着案件
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅)