CGI とは、Common Gateway Interface の頭文字をとったものです。
CGI として有名なのは掲示板やBBSと呼ばれる投稿システムだと思います。他にもチャットやカウンタやアクセス解析やフォームメールなど色々なシステムがあります。
CGI は、ともするとプログラミング言語のようなものと誤解されがちですが、言語ではなく、アクセスによってサーバ側で実行された結果がユーザに返される仕組みを指します。アクセスのたびに実行されるので、サーバ側の環境変数や標準入出力によって動的なコンテンツを作ることが可能です。また、フォームによるユーザ入力を受け取っての動的な処理も可能です。
ホームページづくりも、CGIによって訪問者などとコミュニケーションができるようになると一段と楽しくなります。
≫CGI は何でつくるのか
CGI 自体はプログラミング言語ではありませんが、その動的な仕組みを処理するのはプログラミング言語によります。中でも最もよく使用されているのは Perl です。
Perl は人間の日常言語に比較的近い文法で記述できるスクリプト言語です。Perl は、テキストのマッチ判定や置換処理などに優れた良い意味でトリッキーな言語です。
しかし、Perl はインタプリタ言語(機械語に翻訳しながら実行する)という特性上、コンパイラ言語(実行前に機械語に翻訳済み)の C 言語などに比べて実行が遅くなります。ただし、よほど大規模で実行数の多い CGI でない限りは気にせずガンガン Perl でやりすごせると思います。
Perl や C 以外にも Java や VB なんかでも CGI は作成可能です。
Perl は人間の日常言語に比較的近い文法で記述できるスクリプト言語です。Perl は、テキストのマッチ判定や置換処理などに優れた良い意味でトリッキーな言語です。
しかし、Perl はインタプリタ言語(機械語に翻訳しながら実行する)という特性上、コンパイラ言語(実行前に機械語に翻訳済み)の C 言語などに比べて実行が遅くなります。ただし、よほど大規模で実行数の多い CGI でない限りは気にせずガンガン Perl でやりすごせると思います。
Perl や C 以外にも Java や VB なんかでも CGI は作成可能です。
≫CGI はどうやって実行されるのか
CGI の前に、通常の .html ファイルの場合は以下のようになります。
では、本題の CGI の場合。
- ブラウザから hoge.html ファイルをサーバにリクエスト
- サーバは hoge.html ファイルをブラウザに返す
では、本題の CGI の場合。
- ブラウザから hoge.cgi ファイルをサーバにリクエスト
- サーバは hoge.cgi ファイルを実行
- サーバは hoge.cgi の実行結果をブラウザに返します
≫超シンプルなCGI by Perl
では、動的な仕組みである CGI を至極簡単にだけど具体的に作成してみましょう。
以下の内容をテキストエディタで test.cgi として作成します。
#!/usr/bin/perl
これはPerlパスと呼ばれるもので、Perlがサーバのどこにあるのかを示しています。従って、サーバによっては #!/usr/local/bin/perl だったり色々なので、自分の設置するサーバの Perlパスをあらかじめ調べておきましょう。
$time = time;
$time という変数に time関数の値を代入しています。変数とは数学で習う x や y と同じです。Perlでは変数には $ を付けます。time関数は、1970年1月1日00:00:00から現在時間までの秒数を返します。俗に積算秒と呼ばれたりもします。
ついでに、Perlでは命令の区切りは ; (セミコロン)です。最初のうちはこれの付け忘れによるエラーも多く経験すると思います。注意しましょう。
print "Content-type: text/html;\n\n";
printというのは出力関数です。この場合は標準出力に "Content-type: text/html;\n\n" (ダブルクオートで囲まれた中の部分)を出力しています。出力されているものが何かというと、HTTPヘッダーというものです。「これから text/html を出力しますよ」という前置き・おまじないのようなものです。\n\n というのは、2連続の改行です。HTTPヘッダーと本出力部分の区切りです。
print $time;
今度は、print 関数によって $time を出力しています。HTTPヘッダーの後なので、実際にブラウザに出力されます。
exit(0);
exit によってプログラムの実行を終了させます。(0)はなくてもかまいません。
では、この test.cgi をサーバに転送します。
転送はFTPソフトで行います。FFFTPがたぶんスタンダードでしょう。
設置場所はサーバによっていろいろですが、多くは /cgi-bin/ に CGIファイルは設置することになっていると思います。
パスで示すと、以下の様な位置になるかと思います(以下のどれか)。
/usr/public_html/cgi-bin/test.cgi
/usr/web/cgi-bin/test.cgi
/usr/www/cgi-bin/test.cgi
CGIファイルの転送はアスキーモードで行います。
さて、転送が済んだらパーミションの設定です。
FFFTP なら、転送したファイルを [右クリック]→[属性変更]→0705 としてパーミションを設定します。
パーミションとは、ファイルの実行・読み込み・書き込みの権限を指します。ウィンドウズではあまり気にすることもないかもしれませんが、UNIXなどのネットワーク系のOSではグループやユーザの概念とともに、パーミションと呼ばれる権限の存在があります(ウィンドウズでもプロパティでファイルを読取専用にすることは可能)。
とりあえず、難しく考えることはありません。今は言われるがままに設定してみましょう。
では、いよいよ実行です。
ブラウザで設置した位置に従いURLを打ち込んでみましょう。
例:http://www.example.ne.jp/~hoge/cgi-bin/test.cgi
ブラウザに「1054393162」なんて感じの数字が表示されましたか?
表示されたらOKです。この数字が1970年1月1日00:00:00からCGIが実行された時刻までの秒数です。
リロード(更新)してみましょう。数字が増えましたね。CGIが実行されて、結果が表示されている証拠です。たったのこれだけでも静的なHTMLファイルとは違った動的なコンテンツが出来上がります。
なんか、ワクワクしませんか?
以下の内容をテキストエディタで test.cgi として作成します。
|
#!/usr/bin/perl
$time = time; print "Content-type: text/html;\n\n"; print $time; exit(0); |
#!/usr/bin/perl
これはPerlパスと呼ばれるもので、Perlがサーバのどこにあるのかを示しています。従って、サーバによっては #!/usr/local/bin/perl だったり色々なので、自分の設置するサーバの Perlパスをあらかじめ調べておきましょう。
$time = time;
$time という変数に time関数の値を代入しています。変数とは数学で習う x や y と同じです。Perlでは変数には $ を付けます。time関数は、1970年1月1日00:00:00から現在時間までの秒数を返します。俗に積算秒と呼ばれたりもします。
ついでに、Perlでは命令の区切りは ; (セミコロン)です。最初のうちはこれの付け忘れによるエラーも多く経験すると思います。注意しましょう。
print "Content-type: text/html;\n\n";
printというのは出力関数です。この場合は標準出力に "Content-type: text/html;\n\n" (ダブルクオートで囲まれた中の部分)を出力しています。出力されているものが何かというと、HTTPヘッダーというものです。「これから text/html を出力しますよ」という前置き・おまじないのようなものです。\n\n というのは、2連続の改行です。HTTPヘッダーと本出力部分の区切りです。
print $time;
今度は、print 関数によって $time を出力しています。HTTPヘッダーの後なので、実際にブラウザに出力されます。
exit(0);
exit によってプログラムの実行を終了させます。(0)はなくてもかまいません。
では、この test.cgi をサーバに転送します。
転送はFTPソフトで行います。FFFTPがたぶんスタンダードでしょう。
設置場所はサーバによっていろいろですが、多くは /cgi-bin/ に CGIファイルは設置することになっていると思います。
パスで示すと、以下の様な位置になるかと思います(以下のどれか)。
/usr/public_html/cgi-bin/test.cgi
/usr/web/cgi-bin/test.cgi
/usr/www/cgi-bin/test.cgi
CGIファイルの転送はアスキーモードで行います。
さて、転送が済んだらパーミションの設定です。
FFFTP なら、転送したファイルを [右クリック]→[属性変更]→0705 としてパーミションを設定します。
パーミションとは、ファイルの実行・読み込み・書き込みの権限を指します。ウィンドウズではあまり気にすることもないかもしれませんが、UNIXなどのネットワーク系のOSではグループやユーザの概念とともに、パーミションと呼ばれる権限の存在があります(ウィンドウズでもプロパティでファイルを読取専用にすることは可能)。
とりあえず、難しく考えることはありません。今は言われるがままに設定してみましょう。
では、いよいよ実行です。
ブラウザで設置した位置に従いURLを打ち込んでみましょう。
例:http://www.example.ne.jp/~hoge/cgi-bin/test.cgi
ブラウザに「1054393162」なんて感じの数字が表示されましたか?
表示されたらOKです。この数字が1970年1月1日00:00:00からCGIが実行された時刻までの秒数です。
リロード(更新)してみましょう。数字が増えましたね。CGIが実行されて、結果が表示されている証拠です。たったのこれだけでも静的なHTMLファイルとは違った動的なコンテンツが出来上がります。
なんか、ワクワクしませんか?
≫CGIを覚えるコツ
CGIの作成をお仕事としてやっていこうという人には私はアドバイスできる立場にありませんが、趣味でホームページを作っていて、ちょっとCGIなんかも作成して設置してみたいと言う人に、CGIを覚えるコツを。
あくまで私の場合ですが、最初は全く書くことはせず、配布しているCGIスクリプトを拾ってきて設置してました。
はじめのころは、設置するだけなのにまったくうまくいかずにいろんな配布所の管理人さんにアホな質問とかしまくってました。ただ、設置はどのサイトのCGIも似たようなもので、いくつかやっているうちにすぐ慣れてしまいました。
しかし、設置して動くことは動くようになったものの、デザインの変更にはじまって機能の追加とか色々不満が出てきます。
多くの配布CGIは色々カスタマイズできるようになっていて、変数の初期設定を書き換えるだけでそこそこオリジナルっぽい感じにはなるのですが、欲張りの私はそれだけでは納得できませんでした。特に機能面のカスタマイズはなかなか簡単ではないようでした。
そこで、一冊 Perl のリファレンス(辞書のようなもの)を購入しました。
そこからは、ひたすら解析です。設置したCGIをワンステップごとに何をしているのか調べて、出てくる変数を全てリストアップしてその値を追ったりしてました。
で、そこそこ改造もできるようになったころには Perlの記述や命令もそこそこ覚えていました。そして、ある程度大規模なCGI(例えばツリー式掲示板)などに機能を追加しようと思った時、最初から作った方が早いな、ということになって、一からCGIを作るようになりました(いきなりツリー式は作らなかったですけど)。
とまあ、私のCGIの歴史はこんなもんですが、いちから作るようになるとそこでまたいろいろな壁が出てきますが、そこら辺までこれたらきっと検索エンジンやMLなんかもうまく活用できるようになってますでしょうし、心配は必要ないでしょう。
結論として、「CGIは習うより慣れろ」です。確かにネットワーク上で実行するものなので、セキュリティには充分な配慮が必要ですが、とりあえず実行してみましょう。
あくまで私の場合ですが、最初は全く書くことはせず、配布しているCGIスクリプトを拾ってきて設置してました。
はじめのころは、設置するだけなのにまったくうまくいかずにいろんな配布所の管理人さんにアホな質問とかしまくってました。ただ、設置はどのサイトのCGIも似たようなもので、いくつかやっているうちにすぐ慣れてしまいました。
しかし、設置して動くことは動くようになったものの、デザインの変更にはじまって機能の追加とか色々不満が出てきます。
多くの配布CGIは色々カスタマイズできるようになっていて、変数の初期設定を書き換えるだけでそこそこオリジナルっぽい感じにはなるのですが、欲張りの私はそれだけでは納得できませんでした。特に機能面のカスタマイズはなかなか簡単ではないようでした。
そこで、一冊 Perl のリファレンス(辞書のようなもの)を購入しました。
そこからは、ひたすら解析です。設置したCGIをワンステップごとに何をしているのか調べて、出てくる変数を全てリストアップしてその値を追ったりしてました。
で、そこそこ改造もできるようになったころには Perlの記述や命令もそこそこ覚えていました。そして、ある程度大規模なCGI(例えばツリー式掲示板)などに機能を追加しようと思った時、最初から作った方が早いな、ということになって、一からCGIを作るようになりました(いきなりツリー式は作らなかったですけど)。
とまあ、私のCGIの歴史はこんなもんですが、いちから作るようになるとそこでまたいろいろな壁が出てきますが、そこら辺までこれたらきっと検索エンジンやMLなんかもうまく活用できるようになってますでしょうし、心配は必要ないでしょう。
結論として、「CGIは習うより慣れろ」です。確かにネットワーク上で実行するものなので、セキュリティには充分な配慮が必要ですが、とりあえず実行してみましょう。
≫CGIをやるなら
- ローカルサーバ
CGIは共有サーバで実験など決して行ってはいけません。ローカル(自分のパソコン)にCGI実行テスト用のサーバを入れましょう。ウィンドウズならANHTTPDがオススメです。
- 検索エンジンを活用
CGIを覚えていく過程で遭遇するトラブルのほとんどの解決策はネット上にあるといって過言ではないでしょう。それらに辿り着けるかは検索エンジンを使いこなせるかにかかっています。MLなども活用すべきですが、多くはMLの過去ログだけで事は済んでしまいます。
- サーバの環境
UNIX系のサーバでウェブサーバはApacheがオススメです。こだわる必要はありませんが、バージョンは1系の方がいいかもしれません(2系はまだ新しい)。無料のサーバなどはCGIが使えるといっても様々な制約や癖があるのであまりオススメできません。共有でいいのでレンタルサーバを借りましょう。最近は数百円からあります。
- Telnet とか SSH
TelnetやSSHでアクセスできると、CGIの文法チェックやエラー行を簡単に知ることができます(ただし、実験はローカルで)。また、逆にTelnetやSSH環境がないと開発は非常につらいと思います。
TOP > スクリプト制作メモ > CGI について