スライドショー

PHPにおけるCGIとは?モジュール版とCGI版の違いを徹底解説!

PHPにおけるCGIってなんだろう?
モジュール版とCGI版って言葉を聞いたけど、何が違うんだろう?

こんにちは。HTMLやPHPの開発歴8年の著者が、PHPにおけるCGIについて、とりわけモジュール版とCGI版の違いについてご紹介します。

Webサイトの開発などをしていると、CGIという言葉を聞くことはありませんか?そして、よく聞く言葉ではあるけど、イマイチはっきりとその意味を知らない方も多いのではないでしょうか。

そこで今回は、CGIについての意味とPHPにおけるモジュール版とCGI版などについて簡単に紹介したいと思います!

なお、今回の実行環境はmacOSを前提としています。

PHPにおけるCGIとは

PHPにおけるCGIとは何でしょうか?これを説明するためには、まずはCGIとは何かを説明しないといけませんね。

そもそもCGIとは

CGIとはCommon Gateway Interfaceの頭文字を取ったものです。これは英語を直訳してもちょっと意味が分からないですね。

CGIがどう言うものかを簡単に説明すると、Webサーバ上でプログラムを実行する仕組みのことです。非常に簡潔です。

つまり、どんなプログラムでも Webサーバ上で動いていればそれはCGIだということが言えます。なので、PHPもWebサーバ上で動くプログラムなので、CGIの仲間なんですね。

PHPにはモジュール版とCGI版がある

CGIの意味は先ほど解説した通りなのですが、ただPHPにおいては若干ややこしいことがあります。それは、PHPにおけるモジュール版CGI版の存在です。

この言葉もPHPを使っていればたまに見かける言葉で、でもその意味はあまり知らないというような言葉です。それでは、このモジュール版とCGI版ということについて説明します。

PHPのモジュール版について

PHPにおけるモジュール版とは、簡単に説明するとApacheのRootユーザーでPHPを実行する方法のことです。これだけではどういうことかピンと来ないと思うので、次で詳しく解説します。

モジュール版の特徴

まず、ユーザーがWebページを見ようとWebサーバにアクセスすると、まずはApacheのRootユーザーがPHPファイルを探しに行きます。そしてそのPHPファイルが見つかれば、それをそのままRootユーザーが実行するというのが、PHPにおけるモジュール版の動きになります。

これはCGI版と比べて単純な動作になりますので、モジュール版は処理が速いという特徴があります。

モジュール版の設定方法

XAMPPなどを使ってPHPの実行環境をインストールしていると、基本的にはモジュール版として動いていると思います。PHPがモジュール版で動作しているかどうかを確かめるために、任意のPHPファイルに以下のように記述してブラウザで表示してみましょう。

<?php
    phpinfo();
?>

すると、このような画面が表示されます。


phpinfo()の内容

この中のServer API欄を確認して、Apache 2.0 Handlerとなっていればモジュール版です。

PHPのCGI版について

では、PHPのCGI版とはどういうものでしょうか。簡単に説明するとPHPをApacheのRootではない任意のユーザーで実行する方法と言えます。

そうすることで、CGI版ではどのようなことが起きるのでしょうか。

CGI版の特徴

PHPのCGI版が活躍する場面は、レンタルサーバーなどで複数のユーザーが一つのWebサーバを共有している時などです。例えば、AさんとBさんが一つのWebサーバを共有していたとします。

モジュール版で実行される場合、Aさんの作ったプログラムもBさんの作ったプログラムも、両方ともRootユーザーで実行されてしまいます。すると、AさんのプログラムがBさんのプログラムの実行を邪魔することも十分考えられるということです。

しかし、CGI版で動作しているとAさんとBさんのプログラムは別ユーザーとして実行されているので、お互いに干渉することがありません。ですので、CGI版はセキュリティや安定性が優れていると言えます。

しかし、少々複雑な動きになりますので、モジュール版よりは動作が遅くなります。

CGI版の設定方法

では、CGI版として動作させるには、どのような設定が必要でしょうか。少し複雑ですが、丁寧に解説したいと思います。

例として、 http://localhost/php_cgi_test/ から下のサイトをCGI版で動作させるように設定しましょう。基本的にはhttpd.confファイルに対して設定をすることになります。

まずは、コマンドラインで次のように入力し、cgi-binディレクトリにphp-cgiのシンボリックリンクを作成します。なお、XAMPPはPHPバージョン7.1.30のものをインストールしています。

$ cd /Applications/XAMPP/cgi-bin
$ ln -s /Applications/XAMPP/xamppfiles/bin/php-cgi php-cgi-a

ln -sというコマンドでシンボリックリンクを作成しています。シンボリックリンクとは、Windowsで言うところのショートカットのようなものと思っていただいて構いません。(厳密には違います)

なぜシンボリックリンクを作成するかというと、PHPを実行するユーザーがこのシンボリックリンクを参照するようになるからです。そうすることで別ユーザーとしてphp-cgiのプログラムを起動することができるんですね。

そして次に、httpd.confファイルを修正します。httpd.confファイルは、通常は /Applications/XAMPP/xamppfiles/etc/ ディレクトリにあります。

httpd.confの中の <Directory "/Applications/XAMPP/xamppfiles/cgi-bin"> と書かれた部分を探して次のように修正します。

<Directory "/Applications/XAMPP/xamppfiles/cgi-bin">
    AllowOverride None
#   Options None    モジュール版ではNoneになっているのでコメント化します
    Options FollowSymLinks
    Require all granted
</Directory>

この設定で、cgi-binディレクトリをシンボリックリンク経由で実行できるようにしています。そして、次の設定を追加します。

Action php-cgi-a /cgi-bin/php-cgi-a
<Directory "/Applications/XAMPP/xamppfiles/htdocs/php_cgi_test">
   Options FollowSymLinks Includes ExecCGI
   AddHandler php-cgi-a .php .html
</Directory>

これでphp_cgi_testディレクトリ配下にあるPHPファイルにアクセスした時は、別ユーザーで動作するようになりました。設定が完了したら、Apacheを再起動します。

apachectl configtest
apachectl restart

Apacheを再起動する前に、必ずconfigtestをしてhttpd.confファイルにエラーが無いかをチェックしておきましょう。再起動が完了すると、もう一度phpinfo()を見てみましょう。


phpinfo()の内容

このようにSever API欄がCGI/FastCGIとなっていればCGI版で動作しています。

まとめ

今回はCGIのそもそもの意味と、PHPのモジュール版とCGI版の違いについて解説しました。PHPのモジュール版は動作が速く、CGI版はセキュリティや安定性に優れているのでしたね。

レンタルサーバーでWebサイトを作成している場合はおそらくCGI版で動作していて、あまり気にすることはないかもしれません。しかし、自社サーバとしてWebサーバを構築している場合は意外と重要なポイントになりますので、ぜひ自分の環境に適した設定をしてみてください!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

Tatsuya

Tatsuya

プログラム歴10年のシステムエンジニアです。
経験のある言語はHTML,JavaScript,PHP,VB,VBAなど。
WEB系の開発が得意です。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説