用ASP编写计数器

Author: 杨俊 Date: 2001年 12期

    首先我们应该知道计数器的原理是在上一次的数量上加1的一个过程,也就是说将ASP文件结束执行之后,能够把变量(对象)的内容记录下来。我们可以用下列语句将变量(对象)的内容储存在Application对象之中:
      Application("变量名称")??=变量名称Set Application("对象名称") =对象名称
      而下次网页重新启动时,则使用以下语句将变量(对象)的内容还原回来:
      变量名称=Application("变量名称")??
      Set 对象名称=Application("对象名称")??
      如果觉得编写以上的语句很烦,可以直接把Application("变量名称")当成变量使用,如:
      Application(counter")=Application("counter")+1
      其作用相当于counter=counter+1, 所不同是Application对象的生命周期不会受限于网页的生命周期,所以Application("counter")的值在网页结束时还保留着。
      假设我们提前将访问计数器存放在Application("counter")里面, 那么首页被启动一次,我们就将Application"counter"加1,这样就可以达到累计访问计数器的目的:
      <%
      Application("counter")= Application("counter")+ 1
      %>
      <html>
      <head>
      <title></title>
      </head>
      <body bgcolor="#FFFFFF">
      <h2 align="center">访问计数器 - count1.asp</h2>
      <hr>
      <p align="center">您是本站点第<%=Application"counter"%>位贵宾!</p>
      </body>
      </html>
      其实以上程序并不能完全正确地访问计数器,因为以上程序执行有三个步骤:
      1.读取Application("counter")的值。
      2.将读取的值加1。
      3.将加1之后的值返回Application("counter")。
      如果有两位上网者同时启动网页,并且同时执行了以上的步骤1,那么他们所读取的值相同(假设等于100),接着虽然也都执行了步骤2、3把加1的结果相加Application("counter")而得到101的结果,但实际上却少加了一次。
      怎样解决这个问题呢?那就是不让任何两位上网者同时执行以上的程序,而要避免这个事情的发生,只要把程序改成:
      Application.Lock  '锁定Application对象
      Application.("counter")=Application("counter")+1
      Application.unlock '解除Application对象的锁定
      当某一程序执行了Application.Lock之后,其他程序便暂时不能使用Application对象,直到Application对象被解除锁定为止,所以我们把访问计数器加一的语句放在Application.Lock及Application.UnLock之间,便不会有计数器少加的情况发生了。
      但是Application也不是无限期的,当服务器IIS/PWS关闭时,所累计的人次就会化为乌有。要克服这个问题,我们可以将访问计数器写到文件中,我写了一个Counter子程序,用途就是访问计数器写入到文件中,以上程序改成:
      <%
      Sub IncrementCounter?煟?
      ' 建立一个FileSystemObject对象
      Set fs = Server.CreateObject"Scripting.FileSystemObject"??
      counter_file = Server.MapPath("counter.txt")??
      ' 启动counter.txt文件,并且读取记录在文件中的counter
      Set txt = fs.OpenTextFile(counter_file) ??
      Application("counter")= txt.ReadLine
      txt.Close
      ' 将计数器加1
      Application("counter")= Application("counter") + 1
      ' 将计数器写入counter.txt文件中
      Set txt = fs.CreateTextFile?煟╟ounter_file,True)??
      txt.WriteLine(Application("counter"))?牐?
      txt.Close
      End Sub
      Application.Lock
      IncrementCounter ' 将访问计数器加1并写入到文件中
      Application.UnLock
      %>
      <html>
      <head>
      <title></title>
      </head>
      <body bgcolor="#FFFFFF">
      <h2 align="center">访问计数器 - count3.asp</h2>
      <hr>
      <p align="center">您是本站第 <%=Application"counter"%> 位贵宾!</p>
      </body>
      </html>
      以上制作的访问计数器是以文字来输出的,如果我们想显示图形的访问计数器,只要把计数器的数值转换成图形计数器的HTML标记即可。
      首先必须准备好0~9共10个阿拉伯数字的图形文件,接下来的工作是编写程序将数值转换成图形的HTML标记:
      <%
      Application.Lock
      Application("counter")= Application("counter")+ 1
      Application.UnLock
      Function GCounter(counter)??
      Dim S,i,G
      S = CStr(counter)'先将数值转换成字符串
      '逐个取字符串S的每个字节,然后串成<IMG SRC=?.gif>图形标记
      For i = 1 to Len(S)
      G = G & "<IMG SRC=" & Mid(S,i,1)& ".gif Align=TextTop>"
      Next
      GCounter = G
      End Function
      %>
      <html>
      <head>
      <title></title>
      </head>
      <body bgcolor="#FFFFFF">
      <h2 align="center">访问计数器 - gcount.asp</h2>
      <hr>
      <p align="center">您是本站第 <%=GCounter(Application("counter"))%> 位贵宾!</p>
      </body>
      </html>
      到此为止,计数器完整的制作过程介绍完了,还不错吧!如你也是ASP的爱好者,请来信yjtom@yeah.net与我交流!