Bra sätt att lösa besökare online ?

ASP

13 svar · 369 visningar · startad av erka

Medlem sedan dec. 19996 522 inlägg
Trådstart#1

Jag tänkte visa vilka som är inloggade på en site för tillfället. Då är frågan vilket sätt som är smidigaste om man också tänker på prestanda.

1. Jag skapar ett fält i db:n som heter online och är en bolean. Sedan när någon loggar in sätter jag den till true och i session_on_end i global.asa lägger jag en update som sätter värdet till false. Eftersom namnen på de aktiva besökarna ska visas med en länk vid deras namn på varje sida måste jag hämta ut vilka som har online = true på varje sida (en include) och det faktum att jag redan har rätt mycket databas hämtningar gör att detta skulle söla ner systemet ännu mer. Det fins är att jag enkelt har infon om vilka som är online i db:n

2.När de loggar in så skickar jag deras namn samt namnid till en text fil (separerat med , tecken). Sedan hämtar jag datan från textfilen och splittar upp den efter önskemål och skriver ut det som behövs (en include). I session_on_en lägger jag sedan att de plockar bort raden med personens id ifrån textfilen.

Någon som har lite tipps kanske ?

Medlem sedan dec. 200012 464 inlägg
#2

Skippa databaser och textfiler, lagra användarna i en application-variabel istället.

Medlem sedan dec. 19996 522 inlägg
#3

Jo jag tänkte på det först men kollade på lite andra lösningar då jag inte riktigt förstod hur applications fungerade.

Jag har två värden, användarnamn och användarid tex:
strUserName = "Erik Forsberg"
IntUserId = "1"

och:
strUserName = "Bosse Andersson"
IntUserId = "2"

Hur loopar jag allt som finns i application och skriver ut alla användare?

Medlem sedan feb. 20012 412 inlägg
#4

Skippa databaser och textfiler, lagra användarna i en application-variabel istället.

Problemet är ju att Session_OnEnd inte alltid utförs. Har du något bra kodexempel på hur man får det att fungera LarsG?

mvh Jörgen :)

Medlem sedan dec. 200012 464 inlägg
#5

Jo att session_onEnd inte fungerar är ett problem, men det gäller väl oavsett vilken lösning man använder.

Det enda som jag ser är att man har någon egen hantering av timeout. Det vill säga att man själv lagrar en timestamp som man uppdaterar vid besök och kontrollerar innan man visar data.

Medlem sedan dec. 19996 522 inlägg
#6

Men hur gör man för att få in värden i en application som en 2 dimensionel array.

Något sådant här efter man har logga in eller ?

strUserName = Session("UserName")
IntUserId = Session("UserId")
Application("Online")=Application("Online") & strUsername & IntUserId & "*"

Vad gör * tecknet ? jag kanske är på rätt väg iag. :)

Medlem sedan dec. 200012 464 inlägg
#7

Jo

application.lock
Application("Online")=Application("Online") & strUsername & "*" & IntUserId & "*" 
application.unlock

* är bara för att man skall skilja olika saker åt

users = split(application("online"),"*")
for i = 0 to ubound(users) step 2
response.write "Username: " & users(i)
response.write "Userid: " & users(i+1)
next
Medlem sedan dec. 19996 522 inlägg
#8

Tack LarsG ! Jobbar vidare på det och kommer säkert med någon mer fråga. Var ju på rätt väg iaf ;)

Medlem sedan dec. 19996 522 inlägg
#9

Återkom fort, jag gör en liten test bara för att se om det kan bli som jag vill. skrev lite test kod för att pröva mer fler värden än 1.

<%
Application("Online") = ""

Application.Lock
	strUserName = "Erik Forsberg"
	IntUserId = 1
	Application("Online")= Application("Online") & strUsername & "*" & IntUserId & "*" 

	strUserName = "Bo Frederiksson"
	IntUserId = "6"
	Application("Online")= Application("Online") & strUsername & "*" & IntUserId & "*" 
Application.Unlock

Users = split(Application("Online"),"*")
For a = 0 to ubound(Users) step 2
	Response.Write "Username: " & users(a) &"&nbsp;"
	Response.Write "Userid: " & users(a+1) &"<br>"
Next

%>

Men får då felmeddelandet

Microsoft VBScript runtime error '800a0009' 

Subscript out of range: '[number: 5]' 

/test/inloggade.asp, line 17

Det är raden som skriver ut UserId:t det som kommer ut på sidan är

Username: Erik Forsberg Userid: 1
Username: Bo Frederiksson Userid: 6
Username:   
Microsoft VBScript runtime error '800a0009' 

Subscript out of range: '[number: 5]' 

/test/inloggade.asp, line 17

Vad gör jag för fel eftersom han inte hittar något värde där ? tacksam :)

Medlem sedan feb. 20012 412 inlägg
#10

Hej, prova denna då, borde fungera tycker man.

Users = split(Application("Online"),"*")
For a = 0 to ubound(Users, 2)
Response.Write "Username: " & users(a) &" "
Response.Write "Userid: " & users(a) &"<br>"
Next

mvh Jörgen

Medlem sedan dec. 19996 522 inlägg
#11

Nej den fungerade inte riktigt heller. Jag tror problemet är att man får det separerat så här

Erik Forsberg*1*Bo Frederiksson*6*

Borde man inte kunna göra så här istället

Application("Online")= Application("Online") & strUsername & "," & IntUserId & "*"

Sedan separera den först vid * och sedan vid , tecknen. Men det verkar ändå inte smidigt, det verkar som den inte kommer in i en 2 dim. array efter allt. Någon som har mer tipps ?

Medlem sedan dec. 200012 464 inlägg
#12

Du får nog bete dig lite olika beroende på om application("online") är tom eller inte.

Application.Lock

strUserName = "Erik Forsberg"
IntUserId = 1

if  Application("online") = "" then
Application("Online")= strUsername & "*" & IntUserId 
else
Application("Online")= Application("online") & "*" & strUsername & "*" & IntUserId 
end if

strUserName = "Bo Frederiksson"
IntUserId = "6"
if  Application("online") = "" then
Application("Online")= strUsername & "*" & IntUserId 
else
Application("Online")= Application("online") & "*" & strUsername & "*" & IntUserId 
end if

Application.Unlock
Medlem sedan dec. 19996 522 inlägg
#13

Nu verkar det gå bättre :) tack killar, jag återkommer säkert om någon timme eller dag (förhoppningsvis inte)

Tack igen!

Medlem sedan dec. 19992 085 inlägg
#14

Global.asa är ju ett problem eftersom den inte fungerar så ofta.

Men idé nummer 2 verkar väääldigt omständig.

Ett annat alternativ är väl att man sätter en egen gräns för hur lång tid man ska vara inloggad o sen uppdaterar ett databasfält med senaste laddningstiden hela tiden.

I onlinelista visar du sedan alla som har en tidsdiff som är mindre än typ 20 min.

274 ms totalt · 4 externa anrop · v20260731065814-full.d34c6d5a
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)