|
基本的なことはかなりわかってきたと思いますので、いよいよ実際にCGIとして使えるものを考えてみましょう。
一番簡単でしかもそこそこ実用的な物はアクセスカウンターですよね?
アクセスカウンターでは基本的にどう言う動作をするか考えてみましょう。
まずカウント対象となるファイルにアクセスがあるごとにカウントしていくのですが、
これを普通のCGI(ブラウザで直接呼び出す方式)でやるとどうなるでしょうか?
実はこれは実用的ではないのです。
普通のCGIだとカウント対象ファイルの中にカウンタ用CGIへのリンクやカウンタ用CGIを呼び出すボタン(フォーム)
を埋め込むことになり、
お客さんにリンクやボタンをクリックしてもらわないとカウントされないという非常に不細工なものになってしまいます。
ですから、ここではSSIでやることにしましょう。
SSIですから、カウント対象ファイルに次のコマンドを埋め込みます。
<!--#exec cgi="cgi-bin/count.cgi" -->
すると、このコマンドが埋め込まれた部分にカウンタの出力結果が自動的に埋め込まれますから、実際には
あなたは<!--#exec cgi="cgi-bin/count.cgi" -->番目の来訪者です!
とか、書いておくといいでしょう。
そして、カウンタとしての動作は、
1)これまでのアクセス数を取得する。
2)それに1を足す
3)その結果を表示する
4)新しいカウント数を記録しておく
5)終了
ということになりますね(^^)
ファイルの構成やWebサーバーの設定を次のようにして考えてみましょう。
仮にサーバー名を「www.paddie.com」ユーザー名を「paddie」としておきます。
(:の後の数字はパーミションと思って下さい)
paddie(ホームディレクトリ)
├html:755
│ └index.html(カウント対象ファイル):644
└cgi-bin:777
├count.cgi:755
└count.txt:666
Webサーバーの設定:
・「http://www.paddie.com/~paddie/」へのアクセス
>「html」ディレクトリを参照する
・ディレクトリ自身を参照したい場合、そこに「index.html」があればそれを表示
・「html」ディレクトリは拡張子htmlのファイルがSSI解析対象
・「http://www.paddie.com/cgi-bin/」へのアクセス
>「cgi-bin」ディレクトリを参照する
・「cgi-bin」ディレクトリは書き込み可能
・「cgi-bin」ディレクトリは拡張子cgiがCGI実行の設定
perlのパスは例によって「/usr/bin/perl」とします。
---------- 例 6 ここから ----------
#!/usr/bin/perl
open (IN,"./cgi-bin/count.txt");
$count = <IN>;
close IN;
$count++;
print "Content-type: text/plain\n\n$count";
open (OUT,">./cgi-bin/count.txt");
print OUT $count;
close OUT;
exit;
---------- 例 6 ここまで ----------
ここで注意が必要なのは、SSIで他のファイルを相対パスで書く場合は「コマンドを埋め込んだファイルからの相対パス」で書く必要があるということです。
ですから、ここではカウントスクリプト(count.cgi)と同じ階層にある記録ファイル(count.txt)
を指定するのに「./cgi-bin/count.txt」となっています。
あと、htmlに埋め込んだコマンドが「<!--#exec cgi=〜 -->」だったので、出力にはHTTPヘッダが必要です。
ここで出力されているHTTPヘッダは、print〜の行をみていただくとおわかりと思いますが、
Content-type: text/plain\n\n
というところです。
「Content-type:」で、これから出力されるのが「text/plain」
つまりプレーンテキスト(普通のテキスト)だというのを宣言しています。
次に、改行文字を二つ続けて書いてありますが、実はこれには大切な意味があるのです。
HTTPヘッダは複数行設定可能なんですが、HTTPヘッダと出力本体との境目をはっきりとさせるため、
空行(改行のみの行)を一つ挟む決まりになっているのです。
ですから、「\n\n」と二つの改行文字を出力するというのは、一つ目は「HTTPヘッダ1行目の終了」、
二つ目は「HTTPヘッダ終了合図の空行」と言う意味が込められています。
そこさえきちんと押さえておけば例6の内容自体は至って簡単ですね(^^)
Perlってどう書くの?(4)<
>CGIの部屋へ戻る<
>Perlってどう書くの?(6)
|
|