投稿日: 2024年1月21日
最終更新日: 2024年1月21日
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として使われるのはなぜか」という疑問に対して結論を述べると以下のようになります。
- PHPのアプリケーションサーバーは本番環境では利用できないから
- ApacheからNGINXへの移行が進み、PHPをApacheのモジュールとして使うことが減り、NGINX上で動作させるためにphp-fpmを使ってPHPをCGIとして実行することが増えたから