返回列表 回复 发帖

[转帖]在线人数统计CGI程序剖释

转载:http://gzdzw.51.net
    在线人数统计CGI程序是很多网站都在使用的程序,此程序并不复杂,在这里我以逐行解释的方式来解剖此程序,希望对初学CGI编程的朋友有所帮助。

#!/usr/bin/perl #perl解释器路径
$path= "."; #默认当前主机的绝对路径
$overtime= 3000;#刷新时间, 单位秒,也就是说默认用户将在您的网站上停留多长时间
$buffer = $ENV{'QUERY_STRING'};#将由浏览器端递交来的参数(表单和包含URL中问号后面的参数)赋给变量$buffer。
@pairs = split(/&/, $buffer);#由于递交来的参数都是用&来分隔的,所以将$buffer以&标志分割后赋给数组@pairs。
foreach $pair (@pairs) {#进入循环
($name, $value) = split(/=/, $pair);#由于在递交的参数时都是用name=value格式,所以这里以“=”标志来分割出参数名和参数的值分别赋给变量$name和$value。
############下面一段是对$value进行必要的处理和解码处理#########
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$value =~ s/\t/--/g;
$value =~ s/>/>/g;
$value =~ s/</</g;
$FORM{$name} = $value;#用变量$FORM{$name}来对应$value的值。
}#结束循环。
##############################################################

$people=1;#将变量变$people(在线人数值)赋值1
($sec,$min,$hour,$mday,$mon,$year,$wan) = localtime(time);#读系统时间并将秒赋值给变量$sec;将分赋值给变量$min;将时赋值给变量$hour;将日赋值给变量$mday;将月赋值给变量$mon;将年赋值给变量$year;将星期赋值给变量$wan

$mon++;#因为代表月数[0,11],要将$mon加一之后才能符合实际情况。
open (FILE,"$path/ip.txt");#以只读方式打开ip记录数据文件,此文件是记录访客ip地址和访问时间的数据文件,其记录格式是:202.163.444.231,21,46,30数据之间用“,”分开以利进行数据分割。

@LINES=<FILE>; #以行方式读取ip.txt内的数据并赋给数组成@LINE.
close(FILE);#关闭ip.txt文件
open (FILE,">$path/ip.txt");#以写入方式打开ip.txt文件,注意:用此方式打开时原数据将被清空。
$check=0;#将变量$check赋予0
foreach(@LINES)#进入循环并将数组@LINES内的数据一一指定给$_这个内定变量
{
($addr,$come_hour,$come_min,$come_sec)=split(/,/,$_);#将变量$_内的信息以“,”号标志进行分割,并将分割后的ip地址赋值给变量$addr; 时赋值给变量$come_hour;分赋值给变量$come_min;秒赋值给变量$come_sec.

$flag=($hour-$come_hour)*3600+($min-$come_min)*60+($sec-$come_sec);#将现时的系统时间减记录中的时间
if ( $addr eq "$ENV{'REMOTE_ADDR'}" )#判断语句,如果现在访客返回的ip地址等于记录中的ip地址。
{
print FILE "$ENV{'REMOTE_ADDR'},$hour,$min,$sec\n";将引号内字符串的值写入ip.txt文件中。并打出下一个空行,这里"\n"的意思是打出下一空行。

$check=1;#并将变量$check赋予1值
}
elsif ($flag < $overtime && $flag > 0)#如果上一个判断语句不成立(新的ip地址时),则再来一个判断。如果$flag的值小于所设定的刷新时限且$flag大于0

{
print FILE $_;#将当前项的原数据原封不动地重新写入ip.txt文件
$people++;#在线人数加1。(注意:如果上一条的判断语句没被执行,变量$check的值仍为0)
}
}#循环结束
print FILE "$ENV{'REMOTE_ADDR'},$hour,$min,$sec\n" if ($check == 0);#判断语句,如果变量$check的值等于零,则将此时来访的ip地址和时间加入到ip.txt中。

close (FILE);#关闭ip.txt.
print "Content-type: text/html\n\n";# 设定输出方式为html格式。
print "document.write('当前在线:$people人');\n";#将“当前在线:$people人”这条信息输出到浏览器的对应位置。
exit;#程序结束。

                     我是一个呼吸着现在的空气而生活在过去的人
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
                                     我已习惯了孤独,爱上孤独
                                 他让我看清了自我,还原了自我
                             让我再静静的沉思中得到快乐和满足
                                   再孤独的世界里我一遍又一遍
                                   不厌其烦的改写着自己的过去
                                             延伸到现在与未来
                                       然而那只是泡沫般的美梦
                                 产生的时刻又伴随着破灭的到来
                         在灰飞烟灭的瞬间我看到的是过程的美丽
                                      而不是结果的悲哀。。。
返回列表