CGIに関する世界観です。Perl/CGIやWebサーバーやApacheも参照してください。
HTMLは、単純にHTMLファイルをダウンロードしてWebブラウザに表示させるだけで、リンクを使って別のページに移動する。
これに対してCGIやPHPは、プログラミングとしてのコードをHTML内部に記述したり、HTMLを吐き出すプログラムを作ることで、プログラムを実行した結果をブラウザに表示する。
よって、ただ表示することしか出来ない「静的HTML」とは違い、掲示板やSNSなどの高度な「プログラマブルなWebサイト」を作ることができる。
後日注記:CGIやPHPを使うことで、Webページをサーバーが自動作成することができる。上手く使えば、GUIのアプリケーションと同じことをWeb上で行うことができる。たとえば掲示板やチャットやブラウザゲームのようなWebアプリケーションが作れる。データは基本的にサーバーに保存され、Webページを通じてデータにアクセスしたり、ネットワークのどこからでも共通のアプリケーションの機能を使うことができる。
HTMLも参照のこと。
2023.03.28編集
Perl/CGIはサーバーサイドのダイナミックなWebページの開発技術。サーバーサイドとは、ネットワーク上でサーバー・クライアントの通信を行う時、サーバー側(Webサーバー)で処理するプログラムのこと。これに対してクライアント側(Webブラウザ)で処理するプログラムのことをクライアントサイドと呼ぶ。サーバーサイドには主にPerl/CGI, PHP, Javaサーブレット, ASP.NETのような技術が用いられるのに対して、クライアントサイドにはWebブラウザの組み込み言語であるJavaScriptを用いる。また、サーバーサイドにおけるJavaScriptランタイムであるNode.jsを使えば、サーバーサイドでもJavaScriptを使うことができる。
サーバーサイドで行われる主な処理は、データそのもの(HTMLなど)の自動作成や加工と操作などで、たとえば掲示板やチャットなどが代表的。クライアントサイドで行われる主な処理は、さまざまなダイナミックなブラウザ上のインタラクティブな処理で、ブラウザ上で項目を移動したり作成・削除したりUI処理を行ったりなどのために使われる。
サーバーサイドでは、データがサーバー上に保存されるため、インターネット上の不特定多数の投稿をサーバーで保管するために使うことが多い。このため、掲示板やチャットを作る際にはサーバーサイドの処理が必要となる。
逆に、クライアントサイドはサーバーと通信せず、クライアントのブラウザの中だけで完結する。また、HTMLの自動作成しかできないサーバーサイドに比べて、クライアントサイドではWebブラウザの持つ機能をフルで使うことができ、ページ遷移(別々のページを行ったり来たり)なしでページを操作できる。
そのため、クライアントサイドだけでは基本的にインターネット上のデータの共有はできないが、わざわざネットワーク通信を介してページを遷移しなくても、ローカルのブラウザの機能を使うことで、GUIアプリケーションに負けないインタラクティブなエフェクトや操作性をWebページに持たせることができる。なので、JavaScriptを上手く使えば、GUIアプリケーションと遜色のないアプリケーションをWebで作ることができる。
例外として、Ajaxなどを用いれば、クライアントサイドであってもページ遷移と関係なくネットワーク通信を非同期で行うことは可能である。
JavaScriptやAjaxも参照のこと。
2023.03.28
HTMLの代わりにCGIを用いて、動的なWebページを作ることが出来る。ブラウザにデータを伝達する前の、サーバーサイドの処理。
同様の技術に、PHP、ERB (Ruby)、Javaサーブレット/JSP、ASP.NETのようなものがある。
Perl/CGIについてはPerl/CGIを参照のこと。
HTMLに埋め込む形でサーバーサイドのプログラミングを行う技術・言語。
PHPによるWebプログラミングの入門は以下。
PHPについてはPHPを参照のこと。
以下はPHPのセキュリティ対策。
Perl/Python/Ruby/Javaなどの言語は、PHPと同様にサーバーサイドで使うことが出来ます。
Python、Ruby、Java(サーブレット)を参照のこと。
CGIとApacheモジュールの違いは、CGIはリクエストごとにプロセスを起動し、プロセスが終わったら破棄するのに比べて、mod_phpなどのApacheモジュールは、Apacheのプロセス内部でのスレッドで処理を行う。
これはJavaサーブレットなどにもみられる優位性であり、一般的にCGIよりもmod_phpやJavaサーブレットの方がオーバーヘッドが少なく効率が良いとされている。
後日注記:一般に、複数のプロセスを作成・破棄するよりも、単一のプロセスの中でスレッドを作成・破棄するほうが軽量かつ効率的でパフォーマンスがいい。そのため、Perl/CGIでWebアプリケーションを開発するよりも、PHPやJavaサーブレットのようなスレッドベースの機構を用いてWebアプリケーションを開発したほうが、高速かつ軽量なサービスを開発できる。
Linuxシステムコール・API(プロセス・メモリ)も参照のこと。
2023.03.28編集
CGIがPHPやJavaサーブレットに比べてパフォーマンスが悪いと言われるのに対し、FastCGIという機構も存在する。FastCGIでは、FastCGIサーバーが常に常駐してメモリに起動することで、PHPやJavaサーブレットに負けないパフォーマンスを発揮する。
FastCGIを参照のこと。
2023.03.28編集
CGIは、一回の送信と受信で処理が完結される、という特徴を持つ。一回リクエストして、それでHTMLが返ってきたらそこで終わりである。逆に言えば、セッションをまたいで一時的な情報を保持しておくことができない。これを「ステートレス」(状態なし)と言う。
CGIのようにステートレスではなく、状態を保持しておきたい場合は、ソケット通信でサーバーとクライアントを繋ぐプログラムを書く必要があるだろう。Cookieを使って一時的にサイトの情報をローカル環境に保存しておいてそれを確認する、というやり方や、ログイン情報を保持しておきたいだけであればBASIC認証のような機能を使うこともできる。
ただし、これはあくまで一時的な状態をプログラムの中で保持できないということであり、サーバー側でファイル読み書きをしたりして一時的な情報を確保することは可能である。Perlで作られたネットゲームなどでも、プレイヤーの情報などは一時的な専用のファイルやデータベースに保持されている。また、Googleなどがやっているように、ビッグデータをAIが解析する、という方法も最近では良く使われるようになりつつある。最近のWebアプリケーションは、YouTubeのミックスリストのように、機械学習で表示内容を変えるのが主流になりつつある。よって、CGIで必ずしもデータの記録が不可能であるわけでは全くなく、その逆に、クラウドアプリケーションはデータの置き場所をどんどんローカルからリモートに移動させようとしている。これはサービスがどのように運営されているのかをよく確認しなければ危険である。たとえば、Yahoo!のサービスは長期間ログインしていないと勝手に削除される。できるだけ、Googleのような安心できるサービスを使うこと。それもIT能力のひとつである。
後日注記:ステートフル・ステートレスについては、以下の書籍が参考になります。
状態も参照のこと。
クライアントサイドとサーバーサイドという言葉以外に、Webの開発ではフロントエンドとバックエンドという用語があります。
基本的に、フロントエンドとはクライアントサイドのことで、バックエンドはサーバーサイドあるいはデータベースのことです。
あるいは、フロントエンドはサービスの目に見える部分の開発のことで、サーバーサイドは目に見えない部分の開発のことです。
フロントエンドエンジニアは、HTML/CSS/JavaScriptを使って、ユーザーの操作するWeb画面を作ります。
バックエンドエンジニアは、PHPやRubyあるいはそれ以外のさまざまなプログラミング言語を用いて、サーバー側のプログラミング処理とデータベース処理を行います。
フロントエンドとバックエンドは、APIによって結ばれます。フロントエンドがAPIを使い、バックエンドがそのAPIに対応した処理を記述します。
2023.05.12
実際の開発では、フロントエンドにReactやNext.jsのようなクライアントで動くフレームワークを使い、バックエンドにはNode.jsやExpressのようなサーバーサイドのフレームワークと、MySQLやPostgreSQLのようなデータベース管理システムを使い、REST APIとJSONで両者を結合します。
実際のAPIを実現するのはたとえばNode.jsとExpressです。Node.jsとExpressを使うことで、フロントエンドとバックエンドをどちらもJavaScriptで開発できます。
2023.06.30
CGIはリクエストのたびにプロセスを起動するためオーバーヘッドが大きい。これに対してApacheのモジュールとして動くPHPやアプリケーションサーバとして動くJavaサーブレットはスレッドベースであるためオーバーヘッドが少なくCGIよりも性能が高い。
CGIはステートレス(状態の情報がない)が、クッキーやセッションを使うことでスレートフルな状態の情報を扱える。
Perlのような言語でも、CGIではなくFastCGIを使うことでオーバーヘッドの問題を解決できる。FastCGIは常にメモリに常駐する。