0x0b
cgi&perl&php
最終更新:
0x0b
-
view
CGI(Common Gateway Interface)
ウェブサーバ上でユーザプログラムを動作させるための仕組み。現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。
ウェブサーバプログラムの機能の主体は、あらかじめ用意された情報を利用者(クライアント)の要求に応じて送り返すことである。そのためサーバプログラム単体では情報をその場で動的に生成してクライアントに送信するような仕組みを作ることはできなかった。 そこでサーバプログラムから他のプログラムを呼び出し、その処理結果をクライアントに送信する方法が考案された。それを実現するためのサーバプログラムと外部プログラムとの連携法の取り決めがCGIである。
CGIは環境変数や標準入出力の扱える実行環境からであればプログラミング言語の別を問わず幅広く利用できるが、実行速度やテキスト処理の容易さなどの兼ね合いによりPerlが使われることが多かった。近年では、Perlに加えてPython、Rubyなども広く使われている。
代表的なアプリケーションには、電子掲示板、アクセスカウンタ、WikiやBlogシステムなどがある。
近年では、Webサーバのプロセスとしてインタプリタを常駐させておくことにより、CGIからプログラムを呼び出すオーバヘッドを減らし、パフォーマンスを向上させたJava Servletやmod_perl、mod_php、FastCGI、WSGIなどのインタフェース・実装も出現している。
ウェブサーバ上でユーザプログラムを動作させるための仕組み。現存する多くのウェブサーバプログラムはCGIの機能を利用することができる。
ウェブサーバプログラムの機能の主体は、あらかじめ用意された情報を利用者(クライアント)の要求に応じて送り返すことである。そのためサーバプログラム単体では情報をその場で動的に生成してクライアントに送信するような仕組みを作ることはできなかった。 そこでサーバプログラムから他のプログラムを呼び出し、その処理結果をクライアントに送信する方法が考案された。それを実現するためのサーバプログラムと外部プログラムとの連携法の取り決めがCGIである。
CGIは環境変数や標準入出力の扱える実行環境からであればプログラミング言語の別を問わず幅広く利用できるが、実行速度やテキスト処理の容易さなどの兼ね合いによりPerlが使われることが多かった。近年では、Perlに加えてPython、Rubyなども広く使われている。
代表的なアプリケーションには、電子掲示板、アクセスカウンタ、WikiやBlogシステムなどがある。
近年では、Webサーバのプロセスとしてインタプリタを常駐させておくことにより、CGIからプログラムを呼び出すオーバヘッドを減らし、パフォーマンスを向上させたJava Servletやmod_perl、mod_php、FastCGI、WSGIなどのインタフェース・実装も出現している。
仕様
CGIの仕様はNCSAにより最初に定義・実装(NCSA HTTPdにおいて)され、現在の最新版はCGI1.1である。2004年にRFC 3875となった。
RFC3875 The Common Gateway Interface (CGI) Version 1.1
CGIの仕様はNCSAにより最初に定義・実装(NCSA HTTPdにおいて)され、現在の最新版はCGI1.1である。2004年にRFC 3875となった。
RFC3875 The Common Gateway Interface (CGI) Version 1.1
CGIは、典型的には以下のような動作を期待される。CGIを経由して実行されるプログラムのことを、CGIプログラムと呼ぶ。
CGIプログラムはウェブサーバがクライアントからのリクエストに応じて起動する。
典型的には、ウェブサーバの公開領域に置かれたプログラムに対応するURIへのリクエストがあると、サーバはそのプログラムをCGIの取り決めに従って呼び出す。
CGIプログラムへの情報の入力は、コマンドライン引数、環境変数、標準入力によって行われる。
ウェブサーバがプログラムを呼び出す時点でいくつかの環境変数を定義することが定められている。
特に、クライアントがサーバに要求したURIのうち、検索文字列(Query String)部が環境変数 QUERY_STRING に設定されるので、これはHTMLフォームからGETメソッドで入力を受けるのに便利である。
QUERY_STRINGに文字'='が含まれない場合は、サーバはQUERY_STRINGの内容をコマンドライン引数としてCGIプログラムに渡す。これはHTMLのISINDEX要素を用いて送信された情報を扱うのに便利である。
クライアントからのHTTPリクエストのBODY部はCGIプログラム標準入力に流し込まれる。また、その入力の長さが環境変数CONTENT_LENGTHに設定されている。これはHTMLフォームからPOSTメソッドで入力を受けるのに便利である。
CGIプログラムに対応する仮想パスの後に、更に余分のパスが続いた場合、その情報は環境変数 PATH_INFO に格納され PATH_INFO をウェブサーバの仮想パスと解釈した際に対応すべき物理パスが環境変数 PATH_TRANSLATED に格納される。この方式もまたCGIプログラムにユーザー側からパラメータを渡す目的でよく用いられる。
プログラムが標準出力に出力したデータは、ウェブサーバを経由してクライアントに送られる。このデータは正当なHTTPヘッダで始まらなければならない。
ただし、いくつかの特別なヘッダフィールドは「サーバディレクティブ」として解釈され、ウェブサーバの挙動(ステータスコードなど)に影響を与える。これ以外の全てのヘッダフィールドはそのままクライアントに送信される。
現在のWWWではHTMLが中心的な役割を果たしているので、CGIプログラムはHTMLを出力するケースが圧倒的に多い。
画像データなどを出力することもある(これはアクセスカウンタなどを作る際に使われる)。
CGIプログラムはウェブサーバがクライアントからのリクエストに応じて起動する。
典型的には、ウェブサーバの公開領域に置かれたプログラムに対応するURIへのリクエストがあると、サーバはそのプログラムをCGIの取り決めに従って呼び出す。
CGIプログラムへの情報の入力は、コマンドライン引数、環境変数、標準入力によって行われる。
ウェブサーバがプログラムを呼び出す時点でいくつかの環境変数を定義することが定められている。
特に、クライアントがサーバに要求したURIのうち、検索文字列(Query String)部が環境変数 QUERY_STRING に設定されるので、これはHTMLフォームからGETメソッドで入力を受けるのに便利である。
QUERY_STRINGに文字'='が含まれない場合は、サーバはQUERY_STRINGの内容をコマンドライン引数としてCGIプログラムに渡す。これはHTMLのISINDEX要素を用いて送信された情報を扱うのに便利である。
クライアントからのHTTPリクエストのBODY部はCGIプログラム標準入力に流し込まれる。また、その入力の長さが環境変数CONTENT_LENGTHに設定されている。これはHTMLフォームからPOSTメソッドで入力を受けるのに便利である。
CGIプログラムに対応する仮想パスの後に、更に余分のパスが続いた場合、その情報は環境変数 PATH_INFO に格納され PATH_INFO をウェブサーバの仮想パスと解釈した際に対応すべき物理パスが環境変数 PATH_TRANSLATED に格納される。この方式もまたCGIプログラムにユーザー側からパラメータを渡す目的でよく用いられる。
プログラムが標準出力に出力したデータは、ウェブサーバを経由してクライアントに送られる。このデータは正当なHTTPヘッダで始まらなければならない。
ただし、いくつかの特別なヘッダフィールドは「サーバディレクティブ」として解釈され、ウェブサーバの挙動(ステータスコードなど)に影響を与える。これ以外の全てのヘッダフィールドはそのままクライアントに送信される。
現在のWWWではHTMLが中心的な役割を果たしているので、CGIプログラムはHTMLを出力するケースが圧倒的に多い。
画像データなどを出力することもある(これはアクセスカウンタなどを作る際に使われる)。
The CGI Specification(archive.org)
RFC 3875 The Common Gateway Interface (CGI) Version 1.1
RFC 1630 Universal Resource Identifiers in WWW
RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1
RFC 3875 The Common Gateway Interface (CGI) Version 1.1
RFC 1630 Universal Resource Identifiers in WWW
RFC 2616 Hypertext Transfer Protocol -- HTTP/1.1
サーバサイドスクリプト
Webプログラミングでは、サーバ側で動作するプログラムとクライアント側で動作するプログラムの両方を開発しなければならない
例としてサーバサイトにつかう言語と環境としてCGI + PerlやPHP、Ruby、Java Servlet + JSP + Enterprise JavaBeans + Spring Framework + Apache Struts(Java EE)、.NET(ASP.NET(C#,VB.NET))などが挙げられる。
サーバサイドでのプログラミングには次のような特徴がある。
アクセスが殺到しやすいウェブサイトではデータベースに高い負荷がかかりがちであるため、その解決のためにDBMSの知識がソフトウェア開発において求められることが多い。さらに金融系や基幹系業務やB2Bなどミッションクリティカルな領域での開発ではフロントエンドだけでなくバックエンドの開発も行うためUNIXやサーバ、ネットワーク、セキュリティ、計算機科学、ソフトウェア工学の知識が求められる事が多い。
またサーバサイドのプログラムでは多くの場合、複数ユーザの操作に応じた処理が同一プロセスのメモリ空間上で行われるので、ユーザごとに適切にメモリ上の情報が分離されるよう意識してプログラミングしなければならない。例えばJava ServletやJSPでクラス変数を不適切に使用して、そのサーブレットにアクセスする複数のユーザがその変数を共有してとんでもない事態に発生するミスも過去に実際起きている。この変数がもし銀行口座の預金残高などに使われていた場合、その事態は顧客やエンドユーザーからの信用を徹底的に失うほど非常に深刻なものとなる。
Webプログラミングでは、サーバ側で動作するプログラムとクライアント側で動作するプログラムの両方を開発しなければならない
例としてサーバサイトにつかう言語と環境としてCGI + PerlやPHP、Ruby、Java Servlet + JSP + Enterprise JavaBeans + Spring Framework + Apache Struts(Java EE)、.NET(ASP.NET(C#,VB.NET))などが挙げられる。
サーバサイドでのプログラミングには次のような特徴がある。
アクセスが殺到しやすいウェブサイトではデータベースに高い負荷がかかりがちであるため、その解決のためにDBMSの知識がソフトウェア開発において求められることが多い。さらに金融系や基幹系業務やB2Bなどミッションクリティカルな領域での開発ではフロントエンドだけでなくバックエンドの開発も行うためUNIXやサーバ、ネットワーク、セキュリティ、計算機科学、ソフトウェア工学の知識が求められる事が多い。
またサーバサイドのプログラムでは多くの場合、複数ユーザの操作に応じた処理が同一プロセスのメモリ空間上で行われるので、ユーザごとに適切にメモリ上の情報が分離されるよう意識してプログラミングしなければならない。例えばJava ServletやJSPでクラス変数を不適切に使用して、そのサーブレットにアクセスする複数のユーザがその変数を共有してとんでもない事態に発生するミスも過去に実際起きている。この変数がもし銀行口座の預金残高などに使われていた場合、その事態は顧客やエンドユーザーからの信用を徹底的に失うほど非常に深刻なものとなる。
クライアントサイドスクリプト
クライアント側のプログラミングは困難となりがちである。これを省力化するためのライブラリが様々に用意されており、例としてJavaServer Facesの部品として利用可能なライブラリAjaxFaces、JSPカスタムタグライブラリとして導入できるAjaxTags、JSP, JSF両方で利用可能なAjaxAnywhere等がある。なお、これらはいずれもAJAXを実現するライブラリで、これらを用いることでJavaScript等によるクライアントサイドのコードの開発に比重を置くことなく、リッチなウェブアプリケーションを開発できることが期待できる。
クライアント側のプログラミングは困難となりがちである。これを省力化するためのライブラリが様々に用意されており、例としてJavaServer Facesの部品として利用可能なライブラリAjaxFaces、JSPカスタムタグライブラリとして導入できるAjaxTags、JSP, JSF両方で利用可能なAjaxAnywhere等がある。なお、これらはいずれもAJAXを実現するライブラリで、これらを用いることでJavaScript等によるクライアントサイドのコードの開発に比重を置くことなく、リッチなウェブアプリケーションを開発できることが期待できる。
クライアントサイドでのプログラミングは、Ajax(JavaScript + XML)のようにウェブブラウザ上で動くプログラミング言語を用いて行われるケースもあるが、近年ではリッチクライアントが登場し、ウェブブラウザのかわりにブラウザ依存を避けられるJava Web StartやClickOnceやAdobe Flashを使うケースも増えている。
JavaScriptを用いる場合、ウェブブラウザには様々な実装系があるため[3]、クライアント側のでプログラミングを行うためには、複数の実装系に精通している必要があった。しかし、JavaScriptに使用されているAjaxがGoogle Mapsに実装されることで脚光を浴びるにつれて、Ajaxに使用する(prototype.jsなどの)ライブラリが、ブラウザ依存しにくいように設計されるようになってきた。Ajaxのライブラリ、フレームワークを使いこなしていれば複数の実装系依存に拘る必要は無くなってきている。
従来では、Web開発におけるクライアントサイドといえば、WebデザイナがHTMLと小規模なJavaScriptやAdobe Flashで作られたサイトを開発する程度のものであったため、オブジェクト指向プログラミングの習得についてほとんど意識する必要がなかった。しかし端末ハードウェアの性能が向上し、HTMLクライアントの限界と不満が叫ばれるようになってゆき、Ajaxとリッチクライアントが注目されるにつれて、クライアントサイドでもオブジェクト指向プログラミングを習得する必要性が高まってきた。リッチクライアントに使用する技術の一つであるSwingなどによるGUI開発ではオブジェクト指向プログラミングは、ファットクライアント、スタンドアロンアプリケーション時代から必須のものである。またAjaxのフレームワークの多くはオブジェクト指向プログラミングで設計されている[4]。
ウェブブラウザはウィンドウシステムやウィジェット・ツールキットとは異なり、アプリケーションがGUIを実現できるようにする事を元来の目的とするプログラムではなく、Web上のHTML文書などを閲覧することを主な目的とするプログラムなので、そのプログラム上で良いGUIを実現するには様々な工夫が求められる。その工夫の例としてAjaxやリッチクライアントがある。
JavaScriptを用いる場合、ウェブブラウザには様々な実装系があるため[3]、クライアント側のでプログラミングを行うためには、複数の実装系に精通している必要があった。しかし、JavaScriptに使用されているAjaxがGoogle Mapsに実装されることで脚光を浴びるにつれて、Ajaxに使用する(prototype.jsなどの)ライブラリが、ブラウザ依存しにくいように設計されるようになってきた。Ajaxのライブラリ、フレームワークを使いこなしていれば複数の実装系依存に拘る必要は無くなってきている。
従来では、Web開発におけるクライアントサイドといえば、WebデザイナがHTMLと小規模なJavaScriptやAdobe Flashで作られたサイトを開発する程度のものであったため、オブジェクト指向プログラミングの習得についてほとんど意識する必要がなかった。しかし端末ハードウェアの性能が向上し、HTMLクライアントの限界と不満が叫ばれるようになってゆき、Ajaxとリッチクライアントが注目されるにつれて、クライアントサイドでもオブジェクト指向プログラミングを習得する必要性が高まってきた。リッチクライアントに使用する技術の一つであるSwingなどによるGUI開発ではオブジェクト指向プログラミングは、ファットクライアント、スタンドアロンアプリケーション時代から必須のものである。またAjaxのフレームワークの多くはオブジェクト指向プログラミングで設計されている[4]。
ウェブブラウザはウィンドウシステムやウィジェット・ツールキットとは異なり、アプリケーションがGUIを実現できるようにする事を元来の目的とするプログラムではなく、Web上のHTML文書などを閲覧することを主な目的とするプログラムなので、そのプログラム上で良いGUIを実現するには様々な工夫が求められる。その工夫の例としてAjaxやリッチクライアントがある。
リッチクライアント
HTMLクライアントの欠点を補うために、HTMLクライアントとクライアントサーバシステムで使われてきたファットクライアントとの中間に位置するリッチクライアントも注目されている。リッチクライアントとして挙げられるものは、Java Web Start、.NETのClickOnce、AdobeのAIRなどがある。これらの登場により、クライアントサイドの開発は一変しつつある。
HTMLクライアントの欠点を補うために、HTMLクライアントとクライアントサーバシステムで使われてきたファットクライアントとの中間に位置するリッチクライアントも注目されている。リッチクライアントとして挙げられるものは、Java Web Start、.NETのClickOnce、AdobeのAIRなどがある。これらの登場により、クライアントサイドの開発は一変しつつある。
Perl
PHP
Ruby
PHP
Ruby