24. juli 2002 - 13:36Der er
31 kommentarer og 1 løsning
bruger online opdater
jeg har et system så når en bruger logger in skriver den 1 i en db og når de logger ud skriver den 0. Men hvis de ikke logger ud så står der 1 hele tiden kan man ikke sætte en timeout eller noget lign. så hvis brugern ikke er aktiv inden for 5 min så skriver den 0 i dben??
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
det skal ikke være antal online bruger men hvem er online! fordi hvis en bruger er online viser den brugern under en tabel jeg har lavet på min hp hvis ikke så hvis den under en anden tabel
Men det er noget af en påstand at kalde din fremgangsmåde forkert og den anden mere rigtig (eller mindre forkert). Begge fremgangsmåder er et kompromis mellem funktionalitet og performance og et forsøg på at kompensere for HTTP protokollens manglende state information.
Jeg kan specielt godt lidt (læs: sarkastisk bemærkning), at der argumenteres for fremgangsmåden i artiklen, ved at påstå at det giver bedre performance end ved at bruge en database.
1. Applikations variabler er kun egnet til få opdateringer og mange læsninger. Det er korrekt som der skrives i artiklen, at det er hurtigt at læse fra applikations variabler, fordi de ligger i memory. Men på et site med bare nogenlunde aktivitet, vil alle de opdateringer der vil blive foretaget sløve serveren ned med det samme.
2. Hver gang Application.Lock anvendes, sløver det også serveren ned, da den ikke kan lave andet imens.
3. Den funktion der håndterer dette skal kaldes fra "et eller andet sted". Dette kunne man eks. gøre fra forsiden af sit site, men dette vil give en masse overhead, da koden vil blive udført hver gang siden kaldes = endnu en ting der sløver serveren. Hvis folk går "bag om" forsiden, vil man ikke få alle brugere med på listen, med mindre man ligger kaldet på alle sider = endnu værre ift. performance.
Det eneste argument for ikke at bruge global.asa er, hvis man som det også står i artiklen, ikke har adgang til den.
En påstand bliver altså ikke rigtig, bare fordi den er publiceret på activedeveloper.dk - og hvis den gør, vil jeg publicere min :-)
Hvis du ikke er blevet "lokket" til at skifte fremgangsmåde, og stadig ønsker at fortsætte med din nuv. fremgangsmåde, sig til, så kan vi snakke om de problemer du har.
Cookies ligger sig som en fil på klientens bruger, hvor du selv kan definere hvor langt tid den skal ligge der. Hvor imod en Session er en Server Variabel, som ligger på serveren, og bliver slettet automatisk efter 20 min. hvis ikke sessionen er aktiv...
Du kan lave en activeuser tabel, hvor i du gemmer dem som er online nu. Hver gang man så kalder en side så skal den gå ind og opdatere denne tabel, dvs enten slette eller opdater en user med en tid(): noget i retning af følgende......du må selv ryde op i det da det bare er en kopi past:
'Intialise the ADO recordset object Set rsActiveUsers = Server.CreateObject("ADODB.Recordset")
'Initialise the SQL variable with an SQL statement to get the active users details
strSQL = "SELECT activeuser.* From activeuser WHERE ip='" & strIPAddress & "';"
'Set the cursor type property of the record set to Dynamic so we can navigate through the record set rsActiveUsers.CursorType = 2
'Set the Lock Type for the records so that the record set is only locked when it is updated rsActiveUsers.LockType = 3
'Query the database rsActiveUsers.Open strSQL, strCon
'If there are no records for this user then add them to the datatbase If rsActiveUsers.EOF Then
strSQL = "DELETE FROM activeuser WHERE activeuser.active < Now() - 0.0070;"
'Detlete from database adoCon.Execute(strSQL)
'Delete older second entries if the user has returned in under 10 minutes with a new IP If lngActiveUsersID <> 2 Then
strSQL = "DELETE FROM activeuser WHERE activeuser.user_id=" & lngActiveUsersID & " AND activeuser.ip <> '" & strIPAddress & "';"
'Detlete from database adoCon.Execute(strSQL) End If
'Requery the database to allow access to catch up rsActiveUsers.Requery
'Close the recordset rsActiveUsers.Close Set rsActiveUsers = Nothing
'To save another database hit we can get the number of members online by taking the number of guest away from the total active users intActiveMembers = intActiveUsers - intActiveGuests
Du skal lige være opmærksom på specielt en ting vedr. sessioner til at styre online brugere. Hvis du kører ASP på IIS4 (som mange webhoteller stadig gør), er der et problem med Session_OnEnd som er den rutine i global.asa der kører, når en session dør.
Hvis en bruger ikke eksplicit logger ud med Session.Abandon, kører Session_OnEnd kun i 95-97% af situationerne. Det betyder at du stadig kan ende med aktive brugere på listen, der ikke reelt er aktive. Uanset om du anvender en database, tekstfil, applikations variabler.
Og så skal du også være opmærksom på, at brug af sessioner kræver at brugeren accepterer cookies, da der sendes en sessions cookie med alle requests/responses.
Den her skulle være nogen lunde til smide direkte ind i dit asp-dokument...husk at ændre tabel-navne så de passer til dine har oversta kommentar til dansk....:) sig til hvis det er den vej du vil for ellers vil jeg ikke gøre mere ud af det.
<% Dim rsActiveUsers 'RS to hold the active users Dim strIPAddress 'Holds the uesrs IP address to keep track of em with Dim dtmLoggedIn 'Holds the date/time the user logged in Dim dtmLastActive 'Holds the date/time the user was last active Dim strBrowserUserType 'Holds the users browser type Dim intActiveUsers 'Holds the number of active users Dim intActiveGuests 'Holds the number of active guests Dim intActiveMembers 'Holds the number of logged in active members Dim blnHideActiveUser 'Holds if the user wants to be shown in the active users list Dim lngActiveUsersID 'Hols the active users ID number
'Hvis der er så updatere Else strSQL = "UPDATE activeuser SET activeuser.user_id=" & lngActiveUsersID & ", activeuser.active=Now(), activeuser.hide=" & blnHideActiveUser & " WHERE ip='" & strIPAddress & "';"
adoCon.Execute(strSQL) End If
'Slet gamle bruger
strSQL = "DELETE FROM activeuser WHERE activeuser.active < Now() - 0.0070;"
adoCon.Execute(strSQL)
rsActiveUsers.Requery rsActiveUsers.Close Set rsActiveUsers = Nothing %>
<% Set rsActiveUsers = Server.CreateObject("ADODB.Recordset") strSQL = "SELECT activeuser.*, user.username FROM user, activeuser WHERE user.user_id = activeuser.user_id ORDER BY activeuser.active DESC;"
rsActiveUsers.Open strSQL, strCon
'Vis aktive brugere Do While NOT rsActiveUsers.EOF
%> <a href="java script:openWindow('pop_up_profile.asp?profile=<%=lngUserID%>','profile','toolbar=0,location=0,status=0,menubar=0,scrollbars=0,resizable=1,width=440,height=470')"><%=strUsername%></a> <% 'Move to the next record in the database rsActiveUsers.MoveNext Loop%>
Baseret på dine kommentarer ovenfor og ikke mindst dette spørgsmål: http://www.eksperten.dk/spm/239083 tyder meget på at du har 2 brugere. Jeg har aldrig tidligere anmeldt nogen som helst, men dette er simpelt hen for tydligt.
likedon > he he - har du noget med Hinge Søstival at gøre :-D Var der ovre for nogle år siden fordi min eks kom fra Ans - det var sgu noget af en våd oplevelse, men fed stemning....
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.