2024年1月21日PHPを学習していると、CGIという単語を見かけることが多いですよね。「まだCGIで消耗してるの?」と思われる方も多いのではないでしょうか。PHPとCGIの関係性を振り返りながら、オワコン技術であるCGIがPHPで使われる理由を考えてみます。Interface)はWebブラウザーからのネットワークリクエストに基づいてプログラムを実行する仕組みです。CGIの登場以前は、Webサーバーは静的なネットワークレスポンスしか返せませんでしたが、CGIによって動的なネットワークレスポンスを返せるようになりました。処理の流れとしては、WebサーバーからCGIに標準入力が渡され、プログラムがそれを標準出力に変換し、CGIからWebサーバーに標準出力が返されます。PHPと(Perlと)CGICGIが登場したのは1993年で、PHPの誕生(1994年)よりも前です。当初は、PHPはC言語で書かれたCGIプログラムでしたが、少しずつ機能が追加されていき、最終的にはプログラミング言語になりました。「PHPは元々CGIを扱うためのプログラムであった」ということになります。前述したように、PHPが誕生したのはCGIの登場よりも前です。PHPの登場以前はCGIの実装手段としてPerlがよく使われていました。PerlはCGIの実装を想定した言語ではなかったため構文が冗長でした。そのような状況でPHPが誕生しました。PHPはHTMLにコードを埋め込むことでCGIを実装する際の冗長性をなくしました。これにより、PHPをCGIとして使う方法が普及しました。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として実行することが増えたから。