アクセスカウンター「計算処理」

Perl
146 Views
書き方って、人それぞれで、これが正解って中々難しいモノで、
コード的に・・・「どぉーなんだ!」って、ご意見も多々有ると思いますが、
以下の感じでコード書いてみました。

自身のブログ・サイドバーでインラインフレームで出力しているモノです。

#!/usr/bin/perl
#上記↑の「魔法の呪文」はサーバーに合わせて下さい。

###<------------------------------------------------------------------------------------
###       初期設定                                                                  
###<------------------------------------------------------------------------------------
$lock_file= 'battle.lock';
$count_file = "counter.log";

#概要
#累計(画像の出力)0~9までの画像を用意して、フォルダー「img」に納めて下さい
#出力「累計、今日、昨日、今週、先週、今月、先月」
#実行ファイル、ログファイルは、サーバーのパーミッションに合わせて下さい。

#この辺を、お好みで、いじって
$figure1 = 10;
$figure2 = 5;
$tt_figure = 10;
$td_figure = 8;

$renzoku = 0;    #連続投稿を許す回数
$new_time = '7'; #何日間が新しい投稿とするか

#各カウンター名称
@YOUBI = ("Total","Today","Yesterday","This Week","Last Week","This Month","Last Month");
###<---------------------------------------------------------------------------------------------
###       ファイルロック・ルーチン                                                                  
###<---------------------------------------------------------------------------------------------
sub filelock {

if(-e $lock_file){($ftm) = (stat($lock_file))[9]; if($ftm < time - 150) { unlink($lock_file); }}
foreach(1 .. 5){if(-e $lock_file){sleep(1);}else{open(LOCK,">$lock_file"); close(LOCK); return;}}
&error("只今他の方が書き込み中です。ブラウザの「戻る」で戻って再度登録を行って下さい。"); 

}
###<---------------------------------------------------------------------------------------------
###       ファイルロック解除・ルーチン                                                              
###<---------------------------------------------------------------------------------------------
sub fileunlock {if(-e $lock_file){unlink($lock_file);}}
###<---------------------------------------------------------------------------------------------
###<---   ホスト情報取得
###<---------------------------------------------------------------------------------------------
sub get_host {

$host = $ENV{'REMOTE_HOST'};
$addr = $ENV{'REMOTE_ADDR'};
if($host eq "" || $host eq "$addr"){ $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); }
if ($host eq "") { $host = $addr; }

}
###<---------------------------------------------------------------------------------------------
###       HTMLヘッダー                                                                              
###<---------------------------------------------------------------------------------------------

sub header {

#+++html出力宣言 ※この一行は絶対に削除不可
print "Content-type: text/html; charset=UTF-8\n\n";
print <<"EOH";
<!DOCTYPE html>
<html lang="js">
	<head>
  <style>
/*お好みでCSSを記載して下さい*/
  </style>
  </head>
  <body>
EOH
}
###<---------------------------------------------------------------------------------------------
###       HTMLフッター                                                                              
###<---------------------------------------------------------------------------------------------
sub footer { print qq|</body></html>|; }
###<---------------------------------------------------------------------------------------------
###<---   カウント計算
###<----------------------------------------------------------------------------------------------

sub counter_calc {

&get_host;
&filelock;
if(!(open(IN,"$count_file"))){&fileunlock;&error("$count_fileのオープンに失敗しました");}
$total=<IN>;$day=<IN>;$yday=<IN>;$week=<IN>;$lweek=<IN>;$month=<IN>;$lmonth=<IN>;$dhost=<IN>;$dsecond=<IN>;
close(IN);
$dbflag_ = 0;
chop $dhost;chop $dsecond;$second = time;
if($host eq "$dhost"){
  $count_time = $second - $dsecond;
  $crzk_ok = 60 * $crzk_time;
  $cnkr_time = $crzk_ok - $count_time;
  unless($cnkr_time < 0 ){$dbflag_ = 1;}
}
if($dbflag_ == 1){
  chop $total;chop $day;chop $yday;chop $week;chop $lweek;chop $month;chop $lmonth;
  ($d_count,$d_day) = split(/:/,$day);$dcount = $d_count;$dday = $d_day;$day = join(':',$dcount,$dday);
  ($w_count,$w_day) = split(/:/,$week);$wcount = $w_count;$wday = $w_day;$week = join(':',$wcount,$wday);
  ($m_count,$f_mon) = split(/:/,$month);$mcount = $m_count;$fmon = $f_mon;$month = join(':',$mcount,$fmon);
  $second = $dsecond;$host = $dhost;$counta = $total;$count_up = 0;
}
else{
  $second = time;
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$d,$d) = localtime(time);
  $mon++;
  chop $total;$total++;
  chop $day;chop $yday; ($dcount,$fmday) = split(/:/,$day);
  if($fmday != $mday){$yday = $dcount;$dcount = 1;}else{$dcount++;} $day = join(':',$dcount,$mday);
  chop $week;chop $lweek; ($wcount,$fmday2) = split(/:/,$week);
  if($wday == 0){if($fmday2 != $mday){$lweek = $wcount;$wcount = 1;}else{$wcount++;}}else{$wcount++;} $week = join(':',$wcount,$mday);
  chop $month;chop $lmonth; ($mcount,$fmon) = split(/:/,$month);
  if($fmon != $mon){$lmonth = $mcount;$mcount = 1;$fmon = $mon;}else{$mcount++;$fmon = $fmon;} $month = join(':',$mcount,$fmon);
  $counta = $total;$count_up = 1;
}
if(!(open(OUT,">$count_file"))){&fileunlock;&error("$count_fileのオープンに失敗しました");}
print OUT $total,"\n",$day,"\n",$yday,"\n",$week,"\n",$lweek,"\n",$month,"\n",$lmonth,"\n",$host,"\n",$second; close OUT;


&fileunlock;
}
###<---------------------------------------------------------------------------------------------
###<---   出力準備
###<---------------------------------------------------------------------------------------------
sub main {
  &counter_calc;
  &header;
  #HTMLテーブルタグを使って出力しました。
  #CSSを用いてデザインも有りだと思います。
  print qq|<table width="100%"|;
  print qq|<td colspan="2">|;
  #↓下記は「累計」で、画像で出力です。
  $daystr1 = sprintf(sprintf("%%0%dld",$tt_figure),$total);
  for($s1=0; $s1<length($daystr1);$s1++){
    local($temp1)=substr($daystr1,$s1,1);
    print qq|<img src="./img/$temp1.gif">|;
  }
  print qq|</td></tr>|;
  #↓何のカウント?になるので、「名称(文字)」を出力
  print qq|<td>$YOUBI[1]</td>|;
  print qq|<td>|;
  #↓下記は、画像の出力では無くて、「文字(数字)」での出力
  $daystr2 = sprintf(sprintf("%%0%dld", $td_figure),$dcount);
  for($s2=0; $s2<length($daystr2);$s2++ ){
    local($temp2) = substr($daystr2,$s2,1);
    print qq|$temp2|;
  }
  print qq|</td></tr>|;
  print qq|<td>$YOUBI[2]</td>|;
  print qq|<td>|;
  $daystr3 = sprintf(sprintf("%%0%dld",$td_figure),$yday);
  for($s3=0; $s3<length($daystr3);$s3++){
    local($temp3) = substr($daystr3,$s3,1);
    print qq|$temp3|;
  }
  print qq|</td></tr>|;
  print qq|<td>$YOUBI[3]</td>|;
  print qq|<td>|;
  $daystr4 = sprintf(sprintf("%%0%dld",$td_month),$wcount);
  for($s4=0; $s4<length($daystr4);$s4++){
    local($temp4) = substr($daystr4,$s4,1);
    print qq|$temp4|;
  }
  print qq|</td></tr>|;
  print qq|<td>$YOUBI[4]</td>|;
  print qq|<td>|;
  $daystr5 = sprintf(sprintf("%%0%dld",$td_month),$lweek);
  for($s5=0; $s5<length($daystr5);$s5++){
    local($temp5) = substr($daystr5,$s5,1);
    print qq|$temp5|;
  }
  print qq|</td></tr>|;
  print qq|<td>$YOUBI[5]</td>|;
  print qq|<td>|;
  $daystr6 = sprintf(sprintf("%%0%dld",$td_month),$mcount);
  for($s6=0; $s6<length($daystr6);$s6++){
    local($temp6) = substr($daystr6,$s6,1);
    print qq|$temp6|;
  }
  print qq|</td></tr>|;
  print qq|<td>$YOUBI[6]</td>|;
  print qq|<td>|;
  $daystr7 = sprintf(sprintf("%%0%dld",$td_month),$lmonth);
  for($s7=0; $s7<length($daystr7);$s7++){
    local($temp7) = substr($daystr7,$s7,1);
    print qq|$temp7|;
  }
  print qq|</td></tr>|;
  print qq|</table>|;
  print qq|</div>|;
  &footer;
exit;
}
#最後に下記を記載
&main;
ここ→

コメント