Howto Create a Hit Counter Using the Global.asa File

If you have a live Web site on the World Wide Web, you may be interested in how many people are visiting your site. You can of course analyze the log files of your Web server but that information is usually difficult to read. The log files contain information for each and every request a visitor has made to your site, including resources like images, Flash movies and so on. This makes it near impossible to extract information about individual users. It would be a lot easier if you could count the number of individual users that have visited you since you started your site. It would also be useful if you could see the number of users that are currently browsing your site.

This article will show you how to accomplish these two tasks by storing the hit counters in Application variables using code in the global.asa file. The disadvantage of this method is that this information is lost when you restart the Web server. Two subsequent articles will demonstrate how to store this information in a text file and in a database, so the value for the counter will be preserved when you restart your Web server.

There is also an ASP.NET version of this article available.

Prerequisites

The code in this article uses Sessions in ASP, so you'll need to have them enabled on your server. See the References section at the end of this article for more information. You'll also need to have access to a file called global.asa in the root of your site. If you run your own Web server, this is not a problem; you can simply create the file yourself. If you are using an ISP, you'll need to check with them if they support the use of the global.asa file, as unfortunately, not all ISPs allow this.

Counting Users

One of the easiest ways to count individual users is in the Session_OnStart event that you can define in the global.asa file. This event is fired whenever a user requests the first page in your Web site. This way, you have the ability to count each unique visitor only once during their visit. As long as the Session remains active on the server, the user won't be counted again. After the Session has timed out (it will automatically time out after a certain interval when no new pages have been requested) or has been explicitly ended, a request to a page will create a new Session, and the user will be counted again.

To keep track of the total number of users that have visited your site since you started the Web server, you can increase a counter for each request a user makes. Let's call this counter TotalNumberOfUsers. You can store that counter in a variable in Application state, so you can retrieve and display it on other pages in your site. You can also create a second counter, called CurrentNumberOfUsers for example, that counts the number of active Sessions on your server. Just as with TotalNumberOfUsers, you increase the value of this counter whenever a new Session is started. However, you should decrease its value again when the Session ends. so you can keep track of the number of users that are currently visiting your site.

Well, enough for the theory; let's take a look at how you can accomplish this.

Start by creating a file called global.asa (note that the extension is different from ordinary ASP pages) and save it in the root of your Web site. Open the file in Dreamweaver, Notepad or in your favorite ASP / HTML editor, and make sure it's completely empty (it shouldn't contain any ASP or HTML tags). Add the following ASP code to the file:

<script language="vbscript" runat="server">
Sub Session_OnStart

End Sub

Sub Session_OnEnd

End Sub
</script>
This code defines the skeleton for the two methods that fire when a new Session is started, and when a Session ends. You'll need to add the code for the counters to these two Subs. To keep track of the total number of users and the current number of users, you'll need to add the following shaded lines of code that create two Application variables:

<script language="vbscript" runat="server">
Sub Session_OnStart
    Application.Lock
    Application("TotalNumberOfUsers") = _
         Application("TotalNumberOfUsers") + 1
    Application("CurrentNumberOfUsers") = _
         Application("CurrentNumberOfUsers") + 1
    Application.Unlock
End Sub
When a user starts a new Session by requesting a page in your site, the code in the Session_OnStart event will fire. This code will lock the Application object temporarily, to prevent two users from writing to it at the same time. Then the Application variables TotalNumberOfUsers and CurrentNumberOfUsers are increased by one. Once they are increased, the Application is unlocked again, so it's available to other users.

To decrease the counter for the CurrentNumberOfUsers, you'll need to add some code to the Session_OnEnd event, that will fire when a Session times out, or when it is explicitly ended. You should just decrease the value for CurrentNumberOfUsers, and leave TotalNumberOfUsers untouched. Add the following shaded lines of code to the Session_OnEnd event in your global.asa file:

    Application.Unlock
End Sub

Sub Session_OnEnd
    Application.Lock
    Application("CurrentNumberOfUsers") = _
         Application("CurrentNumberOfUsers") - 1
    Application.Unlock
End Sub
</script>
Whenever a Session is ended, the value of CurrentNumberOfUsers is decreased by one. This way, its value will always reflect the number of users that are browsing your site right now.

Testing it Out

To test out your hit counter, create a new ASP file and call it Counter.asp. You can save it anywhere in your site. Add the following ASP code to that page:

Total number of visitors: <%=Application("CurrentNumberOfUsers")%><br>
Current visitors: <%=Application("TotalNumberOfUsers")%>
These two lines of code write out the total number of visitors and the current number of visitors. Open the page in your browser and you'll see there is one current user. Also, note that the total number of users is 1. Open another browser (don't use Ctrl+N, but start a fresh instance or use an entirely different brand of browser) and open the counter page. You'll see there are two current users, and two users in total. Wait until both the Sessions have timed out (the default timeout for the IIS Web server is 20 minutes) and open the hit counter page again. You'll see there is one current user, but the total number of users has been maintained and should be 3.

Summary

This short article demonstrated how to create a hit counter that keeps track of the current and total number of users on your site. It stores these variables in Application state so they are available in each page in your Web site. A big disadvantage of storing these variables in the Application is that their values get lost when the Web server is restarted. You should check out the following two articles to see how you can save the counter value for the total number of users in a text file or in a database. By saving the counter to a text file or database, its value can be maintained, even when you restart or reboot the Web server.

Related Articles

References

Download Files


Where to Next?

Wonder where to go next? You can read existing comments below or you can post a comment yourself on this article .


Consider making a donation
Please consider making a donation using PayPal. Your donation helps me to pay the bills so I can keep running Imar.Spaanjaars.Com, providing fresh content as often as possible.



Feedback by Other Visitors of Imar.Spaanjaars.Com

On Sunday, October 03, 2004 2:35:10 PM sadaf said:
very very good and exspresive articals
On Thursday, August 21, 2008 1:39:08 PM Jessie said:
A simpler solution would be to use a web based service with no ads like http://www.netbb.info free customizable web counter and best of all no ads. Simply cut and paste a peice of html to your site and your in business.
On Wednesday, February 11, 2009 2:25:10 PM Haroon said:
Basically if the user will close the browser directly then this Session_OnEnd will not work? Can you provide any suggestion?
On Wednesday, February 11, 2009 9:44:41 PM Imar Spaanjaars said:
Hi Haroon,

Session_OnEnd will not fire directly, but only after it times out on the server. When using SQL Server session state it doesn't fire at all.

Cheers,

Imar

Talk Back! Comment on Imar.Spaanjaars.Com

I am interested in what you have to say about this article. Feel free to post any comments, remarks or questions you may have about this article. The Talk Back feature is not meant for technical questions that are not directly related to this article. So, a post like "Hey, can you tell me how I can upload files to a MySQL database in PHP?" is likely to be removed. Also spam and unrealistic job offers will be deleted immediately.

When you post a comment, you have to provide your name and the comment. Your e-mail address is optional and you only need to provide it if you want me to contact you. It will not be displayed along with your comment. I got sick and tired of the comment spam I was receiving, so I have protected this page with a simple calculation exercise. This means that if you want to leave a comment, you'll need to complete the calculation before you hit the Post Comment button.

If you want to object to a comment made by another visitor, be sure to contact me and I'll look into it ASAP. Don't forget to mention the page link, or the QuickDocId of the document.

For more information about the Talk Back feature, check out this news item.