どうしてPHPは未だにCGIとして使われるのか

オワコン技術であるCGIがPHPで使われる理由

タグ
目次

インスタンスを入力🐘

PHPを学習していると、CGIという単語を見かけることが多いですよね。しかし、「まだCGIで消耗してるの?」と思われる方も多いのではないでしょうか。PHPとCGIの関係性を振り返りながら、オワコン技術であるCGIがPHPで使われる理由を考えてみます。

CGI

CGI(Common Gateway Interface)はWebブラウザーからのネットワークリクエストに基づいてプログラムを実行する仕組みです。
CGIの登場以前は、Webサーバーは静的なネットワークレスポンスしか返せませんでしたが、CGIによって動的なネットワークレスポンスを返せるようになりました。

処理の流れとしては、WebサーバーからCGIに標準入力が渡され、プログラムがそれを標準出力に変換し、CGIからWebサーバーに標準出力が返されます。とてもシンプルです。

PHPと(Perlと)CGI

CGIが登場したのは1993年で、PHPの誕生(1994年)よりも前です。当初は、PHPはC言語で書かれたCGIプログラムでしたが、少しずつ機能が追加されていき、最終的にはプログラミング言語になりました。

つまり、「PHPは元々CGIを扱うためのプログラムであった」ということになります。

前述したように、PHPが誕生したのはCGIの登場よりも前です。PHPの登場以前はCGIの実装手段としてPerlがよく使われていました。

しかし、PerlはCGIの実装を想定した言語ではなかったため構文が冗長でした。そのような状況でPHPが誕生しました。

PHPはHTMLにコードを埋め込むことでCGIを実装する際の冗長性をなくしました。これにより、PHPをCGIとして使う方法が普及しました。

PHPには最近までアプリケーションサーバーが無かった

2012年にリリースされたPHP 5.4から、アプリケーションサーバー(ビルトインウェブサーバー)が利用できるようになりました。

しかし、PHPが提供しているアプリケーションサーバーは開発とテストに利用することが想定されており、本番環境での利用は非推奨です。なぜなら、PHPのアプリケーションサーバーは単一のシングルスレッドプロセスのみを実行するためです。PHPのプログラムを本番環境で実行する場合は、PHPのプログラムをApacheのモジュールとして実行するか、あるいはCGIとして実行します。

Apacheの衰退とNGINXの普及

Apacheはマルチプロセス/マルチスレッドで動作しますが、NGINXはシングルプロセス/シングルスレッドで動作します。シングルプロセス/シングルスレッドで動作するWebサーバーの方が、大量のリクエストを処理する際のメモリの使用量やCPUの負荷が少ないため、WebサーバーのApacheからNGINXへの移行が進んでいます。PHPのプロジェクトも同様にWebサーバーのNGINX化が進んでいると予想されます。

NGINXでPHPのプログラムを配信する場合は、php-fpmを使用してPHPを実行することが一般的です。

php-fpmはCGIを配信するためのアプリケーションサーバーであるためphp-fpmを使う場合は必然的にPHPがCGIとして実行されることになります。

結論

「PHPが未だにCGIとして使われるのはなぜか」という疑問に対して結論を述べると以下のようになります。

  1. PHPのアプリケーションサーバーは本番環境では利用できないから
  2. ApacheからNGINXへの移行が進み、PHPをApacheのモジュールとして使うことが減り、NGINX上で動作させるためにphp-fpmを使ってPHPをCGIとして実行することが増えたから