#!/usr/bin/perl ## ↑この行には、「PerlのPATH」を指定してください。プロバイダごと ## によって設定は異なります。 ## countref.cgi ## referer記録用CGIスクリプト ## 2002-03-27 v0.5 by Maki. ## 設定 ############################################################### ## 以下の設定は環境に合わせて変更してください。 my $REFERERDIR = "../refdir/"; ## refererログ用ディレクトリ my $LOCKDIR = "../lockdir/"; ## ロック用ディレクトリ ## 以下の設定は変更しなくて構いません。 my $LOCKFILE = "referer"; ## ロック用ファイル my $OFFSETHOUR = +9; ## 時差設定用オフセット ## 関数 ############################################################### ## 以下の2つはPerlメモ(http://www.din.or.jp/~ohzaki/perl.htm)より。 ## ロックする sub my_flock { my %lfh = (dir => './lockdir/', basename => 'lockfile', timeout => 60, trytime => 10, @_); $lfh{path} = $lfh{dir} . $lfh{basename}; for (my $i = 0; $i < $lfh{trytime}; $i++, sleep 1) { return \%lfh if (rename($lfh{path}, $lfh{current} = $lfh{path} . time)); } opendir(LOCKDIR, $lfh{dir}); my @filelist = readdir(LOCKDIR); closedir(LOCKDIR); foreach (@filelist) { if (/^$lfh{basename}(\d+)/) { return \%lfh if (time - $1 > $lfh{timeout} and rename($lfh{dir} . $_, $lfh{current} = $lfh{path} . time)); last; } } undef; } ## ロックを解除する sub my_funlock { rename($_[0]->{current}, $_[0]->{path}); } ## 現在年月日を時差つきで生成する sub nowdate2str { my $offset = shift; my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time+($offset*60*60)); return sprintf("%04d%02d%02d", 1900+$year,1+$mon,$mday); } ## 指定されたログファイルにREFERERを記録する sub write_referer { my $reflog = shift; my $referer = $ENV{'HTTP_REFERER'}; open(F, ">>$reflog"); print F $referer,"\n"; close(F); } ### main my $lfh = my_flock(basename => $LOCKFILE, dir => $LOCKDIR) || die("busy!"); my $reflog = $REFERERDIR.nowdate2str($OFFSETHOUR).".log"; write_referer($reflog); my_funlock($lfh);