Using the
global.asa to schedule ASP code execution.
Have you ever had some asp code that needed
to execute every once in a while but, you just didn't know how to
do it.
There is a solution that doesn't involve running any scheduling or
scripting software on the server and is actually very easy to get
working.
You see... there is a file called the
"global.asa". Most ASP newbies probably wonder what the
heck it even is. The Global.asa file is event driven. It can
contain four event procedures: Application_OnStart,
Application_OnEnd, Session_OnStart,
and Session_OnEnd.
These event procedure stubs can contain
script you want to be executed when the application starts or
ends, or when the session starts or ends.
For this article we will be focusing on the Session_OnStart
event. It executes when a user views a page on your Web
application and it only runs once per there session at the site.
With some coding you can use this to schedule a task to
execute. It won't be able to make it execute at exactly a
certain time, but if your site is busy enough it will be very
close.
Here is the 1st example. It simply keeps track of how many
visitors have been to your site and after 100 it resets the count
back to 0 and executes whatever code you need to run. Obviously
you'll need to adjust the "100" to whatever makes sense
for the amount of visitors your site receives.
Contents of the global.asa are below.
<SCRIPT LANGUAGE=VBScript
RUNAT=Server>
Sub Application_OnStart
Application("SessionCount") = 0
End Sub
Sub Session_OnStart
Application.Lock
Application("SessionCount") =
Application("SessionCount") + 1
Application.Unlock
If Application("SessionCount") > 100 Then
Application.Lock
Application("SessionCount") = 0
Application.Unlock
' Here you would put any code you need to run
' do not surround the code with <% %> tags
' For example you might run a database query that checks
for expired accounts
End if
End Sub
</SCRIPT> |
Now lets say you want something to execute 4
times a day. You can store the date & time in a text file and
check it periodically. When the date and time get to be more than
6 hours old the code will write the new date & time to the
text file and then execute the code you want to run. You could
change the "6" to whatever you want and therefore
execute the code more or less often,
This is a pretty great solution although it requires correct
permissions to the text file for reading & writing. If not
you'll get an error.
In this example we are checking the text file every 100 visitors.
You can adjust this amount or remove the "check"
completely so that it checks the file every time, but why check
the file every time when you have a very busy site ? That would
just be a waste of server resources, but it is up to you how far
you want to take this.
In this example you need to start the text file off with a valid
date& time or else you will get an error because the script
will read in an empty value the 1st time.
EXAMPLE: put
8/15/04 12:00:00 PM in the 1st line of the
text file.
You could add code to check for that and handle the error, but I
didn't really care at the time so I didn't do that. As long as
there is a date there when it starts it will keep working.
Contents of the global.asa are below.
<SCRIPT LANGUAGE=VBScript
RUNAT=Server>
Sub Application_OnStart
Application("SessionCount") = 0
End Sub
Sub Session_OnStart
Application.Lock
Application("SessionCount") =
Application("SessionCount") + 1
Application.Unlock
If Application("SessionCount") > 100
Then
Application.Lock
Application("SessionCount") = 0
Application.Unlock
Set ObjMyFile =
CreateObject("Scripting.FileSystemObject")
Set OpenMyFile =
ObjMyFile.OpenTextFile(Server.MapPath("last-update.txt"))
MyFileValue = OpenMyFile.ReadLine
OpenMyFile.Close
If
DateDiff("h",MyFileValue,NOW) > 6 Then
' Here you would put any code you need to run
' do not surround the code with <% %> tags
' For example you might run a database query that checks
for expired accounts
Set WriteMyFile =
ObjMyFile.CreateTextFile(Server.MapPath("last-update.txt"))
WriteMyFile.WriteLine(NOW)
WriteMyFile.Close
End if
End If
End Sub
</SCRIPT>
|
Please Note: There are many
ways to make this better and many different possible variations of
what to check for before executing the desired code. This page
should get you started and give you some ideas.
Also remember that if the web is not set up to run as an
application the "global.asa" will not run. You'll need
to make sure the web is an application. Most Virtual Domains are
by default, but sub webs usually are not.
For the sub webs to run the
'global.asa" they need to be an application as the root
usually is. In NT this is accomplished via the Internet Service
Manager under the properties of the sub web you want to make an
application.
FINAL WORD OF CAUTION: Before you put any
code in your Global.asa to execute, test it first in a
regular ".asp" page. If it doesn't run there it isn't
going to run in your global.asa. Also make sure your file paths
are correct for the text file. Everything has to be perfect for
this sort of thing to work.
Good Luck!
|