アクセスカウンタを作る - CGI(Perl)の基本と掲示板作成
目次
アクセスカウンタ
前回の解説で、PerlでCGIプログラムを作り動かす方法は理解できたと思います。しかしhello.cgiは決まった文を表示するだけなので、HTMLを直接書く場合と比べてメリットがありません。そこで今回は、CGIの醍醐味である、ダイナミック(動的)に変化するページを作りましょう。今回はサンプルとしてアクセスカウンタ(Webページの訪問者が何人あったかをカウントする)を作ります。
今回新たに学ぶこと
- 変数
- ファイルの読み書き
- ヒアドキュメント
アクセスカウンタのプログラム
以下のプログラムをテキストエディタで入力してください。
#!/usr/bin/perl
# アクセスカウンタ
print "Content-type: text/html; charset=Shift_JIS\n\n";
# カウントファイルから読み込み
open(IN, "counter.txt");
$count = <IN>;
close(IN);
# カウント増加
$count++;
# カウントファイルに書き込み
open(OUT, "> counter.txt");
print OUT $count;
close(OUT);
print <<EOL;
<html>
<body>
<p>あなたは $count 人目のお客様です</p>
</body>
</html>
EOL
入力が終わったら、「counter.cgi」という名前でサーバにアップロードし、パーミッションを755にしてください。カウントファイルの準備
CGIプログラムというのは、HTMLを生成し表示させたら、すぐに終了してしまいます。アクセスカウンタを作るには、現在何人訪問したかというカウンタをどこかに保存しなければならないので、ファイルに書き出して保存することにします。テキストエディタを開き、半角で「0」(最初は0人なので)とだけ入力して、「counter.txt」という名前で保存してください。その後、先ほどと同じ手順でFFFTPでサーバのcounter.cgiと同じ場所にアップロードし、パーミッションを「666」とします。「666」はファイルの読み書きができるパーミッションです。
実行する
ブラウザで実行結果を確認してみます。URLに「サーバアドレス/~自分のID/cgi/counter.cgi」と入力してEnterしてください(いちいちURL欄に入力するのは面倒な場合は「サーバアドレス/~自分のID/cgi/」をお気に入りに入れておけば、そこを呼び出すだけでファイル一覧が出ます。セキュリティの関係で出ないサーバもあります)。ブラウザの更新ボタンを押すたびにカウントアップされれば成功です。
プログラムの説明
#!/usr/bin/perl
# アクセスカウンタ
print "Content-type: text/html; charset=Shift_JIS\n\n";
hello.cgiと同じく、決まりきった部分です。先頭の方にコメントでプログラムの概要を書いておくと良いでしょう。ただし、一行目(#!/usr/bin/perl)の前にコメント行を書くとエラーになります。
open(IN, "counter.txt");
counter.txtという名前のファイルを読み込み専用でオープンします。「オープン」というのはテキストエディタなどの「ファイル」→「開く」と同じような意味です。開いたファイルはファイル名ではなく、ファイルハンドルというものを通じて読み書きします。そのファイルハンドルが「IN」です。ここでは読み込み用と言う意味で「IN」と名付けましたが、英数大文字ならどんな名前でも構いません。
$count = <IN>;
<IN>はファイルハンドルINから一行入力する命令です。ここではファイルから一行入力し、$countという変数に代入しています。変数とは、メモリ上に存在し、数値や文字列を保存しておく入れ物のようなものです。例えば、$a = 1; とすると、変数$aに1が代入されます。変数の先頭には必ず半角で$マークが付きます。2文字目以降は英数大文字・小文字など好きな文字を続けます。
close(IN);
ファイルハンドルを閉じます(クローズ)。閉じられた後にファイルハンドルINを使うことはできません。open命令で開いたファイルハンドルは、必ずclose命令で閉じなければなりません。
$count++;
++はインクリメント演算子と言い、変数の値を1だけ増加させる命令です。$countには現在ファイル「counter.txt」に書いてある値が入っていますが、その値が1増加します。$count = $count + 1; と書いても同じ意味です。
open(OUT, "> counter.txt");
open命令で、ファイル名の前に「>」を付けると書き込み専用ファイルとしてオープンします。
print OUT $count;
print命令の最初にファイルハンドルを書くと、出力先がそのファイルになります。ここでは変数$countの値をファイルに出力します。
close(OUT);
ファイルハンドルOUTをクローズします。上記一連の流れにより、「counter.txt」の内容が1増加したものに書き換えられます。
print <<EOL;
ヒアドキュメントと呼ばれる出力方法により文字列を出力します。ここから、次に「EOL」が行の先頭に出てくるまでの間の文字列を、改行なども含めてそのまま出力します。HTMLがそのままの形で書けるので、プログラムが見やすくなります。「EOL」というのは出力の最後を判断するための「識別子」と呼ばれ、どんな文字列でも構いません。「End Of Line」というくらいの意味で付けています。ヒアドキュメントを使うときの注意事項
- 「print << EOL;」というふうに、<<と識別子の間にスペースを空けてはいけない。
- 最後の行は識別子だけを書き改行する。前後にスペースを空けてはいけない。
Perlでは文字列中に変数名を書くと、その変数の値がその場所に展開されます。