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サーバを構築している場合は意外と重要なポイントになりますので、ぜひ自分の環境に適した設定をしてみてください!

この記事を書いた人

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

目次