返回列表 回复 发帖

用Perl制作页面计数器

作者:jkl
email: jklliu@163.net
日期:00-7-1 上午 09:14:49

  网友大都喜欢在自己的主页上做一个计数器来显示自己主页被访问的次数。以前我们只能申请由第三方提供的计数器或用由系统管理员提供的计数器,受到很大限制。现在许多免费空间都提供了CGI权限,因此我们也可以用CGI方式实现一个自己的计数器。
  计数器可以用数据库方式实现,也可以用文本文件方式实现。由于文本文件方式不涉及系统的数据库管理系统,相对简单,容易实现,因此,在这里介绍文本方式的计数器。
  计数器的原理比较简单,页面每次被访问的时候,对记录访问次数的数字加1,然后将这个数显示出来。原理虽然简单,在具体实现上还是需要一定的技巧。
  由于一个CGI程序在服务器上并非一直驻留在内存中,为了对访问次数进行计数,则需要把这个数字存入一个文件中,每当主页被访问时,打开该文件将访问数字加1后再存入文件中。
  网站是多用户环境,在访问文件时必须对文件上锁以禁止其他用户对文件的访问,这样才能保证数据的可靠性。然而不同网站使用的操作系统不同,其对文件上锁的机制也不同。本文采用了一种各种平台都适用的方法,每当有页面被访问时,CGI程序创建一个临时文件,此时若有其它进程也要对文件进行存取则须等待,进程对文件更新后删除该临时文件,等待的进程才能对文件进行存取。
  下面是用Perl实现的一个计数器源代码,并加注了注释:
  1. #!/usr/bin/perl
  2. #存贮表示主页访问量数字的文件
  3. $data = ';/usr/local/etc/httpd/htdocs/counter.data';;
  4. #用作文件锁的临时文件
  5. $lockfile = ';/usr/local/etc/httpd/htdocs/counter.LOCK';;
  6. # 主模块
  7. &increment;
  8. print "Content-Type: text/html\n\n";
  9. print $accesses;
  10. sub increment {
  11. # 检查临时文件是否存在
  12. while (-e $lockfile) {
  13. sleep 2; # 存在则等待2秒
  14. }
  15. # 创建临时文件
  16. open(LOCK," >$lockfile") || die
  17. "Can';t create lockfile.\n";
  18. # 读文件并更新数据
  19. open(DATA,$data) || die "Can';t open data file.\n";
  20. &#36;accesses = < DATA >;
  21. &#36;accesses++;
  22. print DATA "&#36;accesses\n";
  23. close(DATA);
  24. &#35; 删除临时文件,对数据文件开锁
  25.  close(LOCK);
  26. unlink(&#36;lockfile);
  27. }
  28.   你可以在页面上需要显示计数器的地方加上下面的HTML代码,页面被访问的时候,来访者就可以知道自己是第几位来访者了。
  29. < html > < head >
  30. < title >Home Page< /title >
  31. < /head >
  32. < body >
  33. < h1 >Home Page< /h1 >
  34. < p >欢迎您!第
  35. < !--&#35;exec cgi="/cgi-bin/text-counter.cgi" >
  36. 位来访者.< /p >
  37. < /body > < /html >
复制代码
  只要掌握了计数器的原理,就可以设计出称心如意的计数器,使你的主页更有吸引力。  

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