Just nu i M3-nätverket
Gå till innehåll

kontroll av användare online!


jonas-ponas

Rekommendera Poster

jonas-ponas

finns det någon som har en smidig lösning på hur man kan kontrollera om en användare lämnat en sajt utan att logga ut!!!

 

jag har vet en vanlig lösning med timestamp i en tabell som sedan kontrolleras... och om den är för gammal raderas användaren ur online-tabellen.

 

Jag skulle dock vilja ha en bättre lösning om det finns. som inte belastar sql_servern lika mycket.. t.ex ngn javascripts lösning...

 

någon som har en bra lösning??

 

//Yo.nas

 

Länk till kommentar
Dela på andra webbplatser

Man kan lägga in ett JavaScript som antingen skickar användaren till en utloggningssida när denne lämnar din webbplats, eller ett JavaScript som tar bort inloggningskakan på klientdatorn.

 

Hur som helst så kommer du inte kunna ta bort koden för att rensa bort gamla inloggningar, då denna alltid kommer behövas.

Det är faktiskt inget större ploblem med prestandan ska du se.

 

Du får tänka på att JavaScript ligger på klientsidan, och därför kan man aldrig räkna med att detta utförs på korrekt sätt, utan all hantering ska ske på serversidan (samma logik som säger att användare inte kan inmata data på ett korrekt sätt).

 

Enda anledningen att använda sig av ett JavaScript är när man vill göra inloggningen säkrare på en delad dator, och då föreslår jag alternativ två. Men som sagt är detta inget man kan förlita sig på.

 

Länk till kommentar
Dela på andra webbplatser

Utöver Cariads förslag har jag även gjort lite mer (kanske lite resurskrävande, men fungerar i mitt fall):

 

Jag har bestämt att ifall en användare är inaktiv i mer än en halvtimme så är han utloggad vare sig han vill det eller ej.

 

På klientsidan styrs detta av en cookie som sätts om vid varje ny sidvisning och användaren får en ny halvtimme på sig. Har ingen sidvisning skett under en halvtimme så 'dör' cookien och användaren blir utloggad (på klientsidan).

 

Serversidan:

 

I mitt fall handlar det om en community som gör att en användare kan se om andra användare är inloggade eller inte. Därför måste vi "hålla reda på inloggningen" även på serversidan.

 

Detta görs genom en kolumn, i användardatat, som sätts om till 1 när användaren loggar in samt till 0 då användaren loggat ut sig själv eller blivit utloggad av JS-lösningen.

 

Ifall utloggning inte skett även om användaren var inaktiv i mer än en halv timme, så gör jag så här:

 

Jag har en tabell som heter "online" och har två kolumner (userid, timestamp). Vid varje sidvisning uppdateras denna tabell och ny "timestamp" för användaren registreras. (gamla rader tas bort).

 

På servern har jag också en textfil timestamp.txt. Denna fil läses då varje ny besökare besöker webbsajten, samt 10 minuter senare. Tiden i den filen jämförs med aktuell tid. Är skillnaden mindre än 5 minuter görs ingenting.

 

Om skillnaden är större än fem minuter så görs en kontroll av tabellen "online", samt tiden i timestamp.txt uppdateras. Alla användare vars senaste registrerade "sidvisning" är äldre än en halvtimme sätts om som utloggade. De aktuella raderna tas bort från tabellen, för att minimera storleken.

 

Det är en ful lösning jag själv skrivit, då jag helt enkelt inte hittade exempel på ett liknande system. Känns som att den är aningen resurskrävande, men den fungerar vilket var viktigare för mig än "resurstänkande".

 

 

_________

TicoRoman - The One And Only

 

[inlägget ändrat 2003-04-04 13:20:50 av TicoRoman (Almir)]

Länk till kommentar
Dela på andra webbplatser

  • 1 year later...

jag försöker göra en liknande grej men jag har jätteproblem med att jämföra tider.

 

Försöker kontrollera om 30 min har gått från timestampen ja har till "now()" men jag fattar inte hur jag ska göra. Hatar såna här tidsberäkningar överhuvudtaget blir alltid fel för mig =(

 

Hittade en funktion som såg underbar ut och hette "timestampdiff" oturligt nog så ingår den bara i mysql 5.0 och det har jag inte tillgång till (än).

 

kan nån ge förslag på hur jag kan kolla om 30 min har gått?

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon

Kan det här fungera tro?

if (time() - $timestamp > mktime(0,30,0,0,0,0)) { 
// Större än 30 mins skillnad 
} else { 
// 
} 

 

Länk till kommentar
Dela på andra webbplatser

ajo. det gör det nog.

 

glömde skriva att jag ville ha lösningen i sql-satsen =) det är där problemet sitter.

 

har försökt göra en COUNT där jag räknar hur många som är mindre än 30 min men inte lyckats.

 

nåt i stil med:

SELECT COUNT(*) as antal FROM users WHERE (NOW() - timestamp) < 30

 

 

Länk till kommentar
Dela på andra webbplatser

Anjuna Moon
glömde skriva att jag ville ha lösningen i sql-satsen

 

Nä, det var jag som missade att du skrev MySQL Använder inte MySQL, men funkar inte SUBTIME och TIMEDIFF? Eller använder timestamps ett annat format än DateTime?

 

Länk till kommentar
Dela på andra webbplatser

jaaa...

 

DATE_SUB var det enda ja behövde =)

 

så här blev det då:

"SELECT COUNT(*) as antal FROM users WHERE lastvisit > DATE_SUB(NOW(), INTERVAL '30' MINUTE)"

 

tack för hjälpen, poäng

 

Är 30min en rimlig timeout tid förresten? kanske är för långt.

 

[inlägget ändrat 2004-04-13 20:27:02 av Cechise]

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...