【PHP日記】

自分の知識不足を悟った末、なるべく1日一回、Webに関する知識を書いていくだけのブログ。

CGIとは 【6日目】

プログラミング言語PHPの実行環境である「CGI(Common Gateway Interface)」についてまとめてみたいと思います。

概要

まずCGIとはプログラミング言語のことではありません。

PHPが、実際のアプリケーションを開発するためのプログラミング言語だとするならば、CGI作成したプログラムをWebサーバー上で動作させるための仕組みを言います。

元々インターネットの黎明期では、あらかじめ作成されたファイルを表示することしかできなかった(静的ウェブサイト)のですが、動的なプログラミング言語PHP)で書かれたWebサイトにアクセスすることで、PHPで書かれた内容を処理してからユーザーの元に送り返すことが出来るようになりました。(動的ウェブサイト)

このような動的な動きをするWebサイトのことをCGI』が組み込まれたWebサイトである、という言い方をします。


また、PHPで書かれたファイルにアクセスがあることを「リクエスト」と言い、ウェブサーバーはリクエストを感知するとPHPで書かれた処理を走らせてからリクエスト元に返す、と言う動きをします。

この時の、リクエストが来たらPHPを実行させてユーザーの元に返すという一連の動き(仕組み)のことをCGIと言います。

因みに、リクエストに対してPHPファイル呼び出すウェブサーバーソフトウェアを『Apache』と呼び、実際に処理を行う内容を書き込むのが『PHP』になります。


PHPにおける2つの実行方式

ウェブサーバーでPHPを実行する方法は主に2種類あります。

CGI方式

CGIは、ウェブサーバーがリクエストに反応して外部プログラム(PHPPerlで書かれたファイル)を起動して実行し、その結果をクライアントに返す仕組みです。具体的には、クライアントのリクエストがあると、ウェブサーバーは外部プログラムを起動し、そのプログラムが新しいプロセスとして実行されます。

その後、プログラムは処理を行い、結果をウェブサーバーに返します。最後にウェブサーバーはその結果をクライアントに返します。つまり、CGIでは外部プログラムが新しいプロセスとして実行されます。

この方式だと、PHPが実行されるたびに新しいプロセスが立ち上がるため、処理速度が遅くなりがちです。しかし外部プログラムを呼び出すと言うことは、ディレクトリごとにPHPのバージョンであったり、設定ファイルを個別に設定できるメリットがあります。

また、CGI方式はそれぞれのユーザー権限で実行されるため、共有サーバー上で他のユーザーとのファイル干渉がありません。そのためレンタルサーバーではセキュリティ上の観点からCGI方式が利用される、という特徴もあります。


モジュール方式

一方で、モジュール方式ではウェブサーバーとモジュールが同じプロセス内で動作します。ウェブサーバーは事前にモジュール(PHPPerlで書かれたファイル)を読み込んでおり、クライアントからのリクエストがあると、ウェブサーバーのプロセス内でモジュールが直接処理を行います。

外部プログラムを起動するための新しいプロセスが生成されることはありません。モジュールはウェブサーバーの一部として組み込まれており、効率的に処理が行われます。(処理が早い)

つまり、CGIは外部プログラムが新しいプロセスとして実行されるのに対し、モジュール方式ではウェブサーバーとモジュールが同じプロセス内で処理が行われます。

また、ここで言うウェブサーバーとはApacheというウェブサーバーソフトウェアのことで、(世界中で愛用されており)一般的にPHPのモジュール版とはApacheのモジュール機能を使った仕組みのことを指します。


また、モジュール方式はRootユーザーがファイルを実行する仕組みになっています。

Rootユーザー権限は通常、システムの管理者に与えられるものであり、通常のユーザーが持つことはありません。Rootユーザー権限を持つことは、重要な操作やシステムリソース(特殊なメモリ領域)へのアクセスを可能にしますが、その一方で誤った操作や悪意のある行動により、システム全体が危険にさらされる可能性があります。

そのため、共有サーバーという複数人でサーバーを利用する形態において、モジュール方式で実行してしまうと他のユーザーのファイルを参照されてしまうというセキュリティ的リスクも抱えています。


以上です。



参考文献

https://wakaru-web.com/web/php/php-cgi/

https://support.sugutsukaeru.jp/ja/tutorials/frequently-asked-questions/46.html

https://wp-p.info/tpl_rep.php?cat=php-beginner&fl=r5#:~:text=%E3%80%8ECGI%E3%80%8F%E3%81%A8%E3%81%AF%E3%80%8ECommon,%E3%80%8E%E4%BB%95%E7%B5%84%E3%81%BF%E3%80%8F%E3%81%AE%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%80%82

https://www.fenet.jp/dotnet/column/language/9374/