[PHP] session loguit detecteren

Pagina: 1
Acties:

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
Ik wil graag de tijd bijhouden dat iemand ingelogd is. Ik gebruik nu een sessie die de logintijd vastlegt bij de login, maar hoe moet ik de eindtijd vastleggen? Ik kan het wel zo maken dat het wordt vastgelegd als je op logout klikt, maar dat wordt natuurlijk vergeten. Is er geen manier om te detecteren of de sessie beeindigd is?
Ik kon niks vinden met de search of in de man van PHP :(.

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 05-09 23:56
:?

Je kan niet de andere kant op communiceren met HTTP, dus moet je gewoon per view bekijken.

Verwijderd

Om de minuut kijken of de gebruiker nog is ingelogd !?
Anders iets met JS op het onUnload event

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
om de minuut kijken of een ID of usernaam registered is ofzo? Maar hoe doe je dat dan? Je kunt toch geen 'process' op de achtergrond draaien dat dat iedere keer checked, alleen als er van pagina wordt veranderd ofzo, lijkt me... of niet? :P

JavaScript... dat kan natuurlijk ook, nog niet aan gedacht. Maar ik doe het liever met PHP, als het kan :)

Verwijderd

Op maandag 10 juni 2002 21:18 schreef Carnifex het volgende:
om de minuut kijken of een ID of usernaam registered is ofzo? Maar hoe doe je dat dan? Je kunt toch geen 'process' op de achtergrond draaien dat dat iedere keer checked, alleen als er van pagina wordt veranderd ofzo, lijkt me... of niet? :P
In je session variabele directory kijken, daar had ik dacht Tomato ooit een script voor geschreven.

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
hmm, ik heb bijna alle postings waar Tomato iets mee te maken had gezien, maar kan het niet vinden. Ik kan checken of de session id bestaat, maar hoe wordt die handeling dan om de minuut uitgevoerd? Via de cron ofzo? Zodra een sessie dan niet meer gevonden wordt, wordt deze uitgelogd? Lijkt het me nog makkelijker om het met javascript te doen, of niet?

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 14:40

TheDane

1.618

Op maandag 10 juni 2002 21:51 schreef Carnifex het volgende:
hmm, ik heb bijna alle postings waar Tomato iets mee te maken had gezien, maar kan het niet vinden. Ik kan checken of de session id bestaat, maar hoe wordt die handeling dan om de minuut uitgevoerd? Via de cron ofzo? Zodra een sessie dan niet meer gevonden wordt, wordt deze uitgelogd? Lijkt het me nog makkelijker om het met javascript te doen, of niet?
in principe doet volgens mij je sessie manager dat.

uitloggen gebeurt clientside ... en php draait serverside. Met php alleen lukt het je dus nooit.

je kunt daarnaast wel wat met javascript gaan klooien, maar die events zijn niet al te betrouwbaar.

wat je zou kunnen doen is in je sessie de tijd van laatste request bij kunnen houden. als er dan langer dan een kwartier ofzo geen nieuwe timestamp geregistreerd wordt, kun je er wel van uit gaan dat de bezoeker de site verlaten heeft.

Verwijderd

Op maandag 10 juni 2002 21:51 schreef Carnifex het volgende:
om het met javascript te doen, of niet?
je zou met onunload een pop-up kunnen openen die de sessie beeindigd en zichzelf dan ook weer vernietigd.

Probleem opgelost :?

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
dat is idd een goed idee (stom dat ik daar zelf niet op ben gekomen :P), maar dat werkt wel 100%? Omdat theDane zegt dat die events van java niet zo betrouwbaar zijn?

Ik vind het trouwens wel een beetje vreemd dat er geen standaard functie ofzo voor bestaat in PHP. Ik kan me voorstellen dat er meer mensen zijn die willen dat er iets gebeurt als er een session beeindigd wordt. Ik ga het nu iig met dat java-venster proberen, thanxz voor de tip :)

Verwijderd

Op maandag 10 juni 2002 23:08 schreef Carnifex het volgende:
dat is idd een goed idee (stom dat ik daar zelf niet op ben gekomen :P), maar dat werkt wel 100%? Omdat theDane zegt dat die events van java niet zo betrouwbaar zijn?
javascript en die zijn inderdaad niet zo betrouwbaar...
Ik vind het trouwens wel een beetje vreemd dat er geen standaard functie ofzo voor bestaat in PHP. Ik kan me voorstellen dat er meer mensen zijn die willen dat er iets gebeurt als er een session beeindigd wordt. Ik ga het nu iig met dat java-venster proberen, thanxz voor de tip :)
dat willen inderdaad meer mensen en gelukkig gebeurt er ook iets. sessions hebben timeouts (als je dat wilt) en session zijn ook afgelopen als je je browser sluit (behalve konqueror dan, geloof ik)..

zolang een browser een PHPSESSID stuurt is er dus een sessie.

wil je dus weten of iemand ingelogd is, heb je alleen de begintijd nodig en bij elke refresh die tijd updaten. vervolgens kijk je of die user z'n refreshtijd minder dan timeout geleden is.. zoja, dan issie ingelogd..

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
dat is eigenlijk net niet de oplossing die ik zoek. Het idee is namelijk dat je inlogd op de pagina, aan het werk gaat en daarna uitlogd/de browser sluit. Het werk wat gedaan wordt hoeft niet per se iets met de browser te zijn, dus het kan goed zijn dat er 2 uur niet gerefreshed wordt of op een link wordt geklikt.
Ik zou het natuulijk wel zo kunnen maken dat er een klein venster in beeld komt dat iedere minuut automatisch refreshed en dan de logintijd tijd update... maar hoe weet ik dan welke tijd de *final* tijd was zodat ik deze naar de database weg kan schrijven? Of moet ik dan iedere minuut de tijd in de database overschrijven?

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 14:40

TheDane

1.618

de discipline om je zaakjes op een nette manier af te sluiten is meestal niet zo sterk aanwezig. Ik denk dus ook dat je daar niet zomaar vanuit mag gaan. (mensen gaan niet netjes uitloggen van websites)

wat is het nut / doel van het inloggen op die pagina, als de werkzaamheden niet specifiek met die pagina/webinterface te maken hebben ?

Kun je je tijdsregistratie dan niet beter op OS niveau regelen ?

Verwijderd

Nog een andere manier is het maken van een frame. Je verdeelt de pagina in twee frames, 1 van 0 pixels en 1 van 100%.

De frame van 0 pixels laat je om de 5 seconden refreshen met jouw script als locatie. Op die manier wordt er elke +/- 5 seconden een soort van 'keep-alive request' verstuurd. Zodra deze requests wegvallen is de gebruiker blijkbaar uitgelogd/heeft hij de browser afgesloten.

Het klinkt misschien wat rommelig, maar het werkt wel

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 14:40

TheDane

1.618

Op dinsdag 11 juni 2002 14:37 schreef d0g1e het volgende:
Nog een andere manier is het maken van een frame. Je verdeelt de pagina in twee frames, 1 van 0 pixels en 1 van 100%.

De frame van 0 pixels laat je om de 5 seconden refreshen met jouw script als locatie. Op die manier wordt er elke +/- 5 seconden een soort van 'keep-alive request' verstuurd. Zodra deze requests wegvallen is de gebruiker blijkbaar uitgelogd/heeft hij de browser afgesloten.

Het klinkt misschien wat rommelig, maar het werkt wel
opzich wel ja, maar je genereert zo wel aso veel dataverkeer. (stel je voor dat dat op GoT gedaan zou worden, met 50.000 gebruikers, en xduizend pageviews per dag ...

Verwijderd

Lijkt erop dat ie de tijd dat werknemers bezig zijn wil bijhouden (ofzo, ik moet gokken want blijkbaar is het geheim ofzo, want anders was het 10 keer praktischer geweest om gewoon de situatie uit de doeken te doen) .. hij heeft vast geen 50000 werknemers.

daar komt bij dat ze vast niet op 5 seconden uitbetalen dus om de minuut een refresh is ook prima. De data hoeft maar ongeveer 50 bytes te zijn dus het is inderdaad een optie.

Maargoed, misschien is het aan de topicstarter om nu eindelijk eens gewoon te melden wat ie er precies mee wil :)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

De uitspraak die op dit probleem van toepassing is, is "The right tool for the right job". Ik zie maar al te vaak dat mensen oplossingen willen maken in een taal die ze zelf kennen. De taalkeuze hangt dus af van hun eigen mogelijkheden. Deze keuze hoort juist af te hangen van het probleem.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op dinsdag 11 juni 2002 15:02 schreef Janoz het volgende:
De uitspraak die op dit probleem van toepassing is, is "The right tool for the right job". Ik zie maar al te vaak dat mensen oplossingen willen maken in een taal die ze zelf kennen. De taalkeuze hangt dus af van hun eigen mogelijkheden. Deze keuze hoort juist af te hangen van het probleem.
Correct :)

Ik zou zeggen, maak een streaming javaproggie :)

Verwijderd

Op dinsdag 11 juni 2002 15:02 schreef Janoz het volgende:
De uitspraak die op dit probleem van toepassing is, is "The right tool for the right job". Ik zie maar al te vaak dat mensen oplossingen willen maken in een taal die ze zelf kennen. De taalkeuze hangt dus af van hun eigen mogelijkheden. Deze keuze hoort juist af te hangen van het probleem.
Daswaar :) en het probleem kennen we niet.. alleen de moeilijkheden bij de oplossing van het probleem in de verkeerde taal :)

Verwijderd

Op dinsdag 11 juni 2002 15:04 schreef Nielsz het volgende:

[..]

Correct :)

Ik zou zeggen, maak een streaming javaproggie :)
Of een eggdrop die users logged en op alle pc's een irc-client :)

Verwijderd

Ik gebruik zelf altijd een timeout op de user logins. In de database wordt bijgehouden wat de timestamp is van de laatste pageview. Als dit langer dan b.v. een half uur geleden is, wordt de user als uitgelogd beschouwd. Bij het opvragen van een pagina krijgt hij dan ook het login scherm.

Om te zien hoeveel / welke gebruikers ingelogd zijn kan je een query in de database doen welke gebruikers maximaal een half uur geleden een pageview hebben gedaan. Om te kijken welke gebruikers actief zijn (bezig met het systeem) kan je een query doen welke gebruikers maximaal 5 minuten geleden een pageview hebben gedaan.

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
hehe, het is niet geheim hoor, het is inderdaad de bedoeling de tijd bij te houden van werknemers. Het probleem is dat het vaak voorkomt dat we op een pc werken die niet van ons is maar wel internet heeft. Het leek mij makkelijk om bij te houden hoeveel we werken via een website: alleen ff inloggen en je tijd wordt bijgehouden en je kunt aan de slag.
Bij het formuleren van het probleem had ik niet het idee dat iemand hoeft te weten waar het voor is, maar daar heb ik me blijkbaar in vergist :z.
Ik had eigenlijk gehoopt dat ik een of andere functie in PHP over het hoofd had gezien en dat als iemand mij daar op kon wijzen het probleem uit de wereld was geholpen :P.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 28-08 12:00

Janoz

Moderator Devschuur®

!litemod

Op dinsdag 11 juni 2002 19:36 schreef Carnifex het volgende:

Ik had eigenlijk gehoopt dat ik een of andere functie in PHP over het hoofd had gezien en dat als iemand mij daar op kon wijzen het probleem uit de wereld was geholpen :P.
Het is eigenlijk meer dat je een belangrijke eigenschap van het http protocol over het hoofd ziet. Http is een soort 'vraag -> lever' techniek. Er is dus standaard geen realtime communicatie mogelijk.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
hmm, maar het had toch ook zo kunnen zijn dat er een 'event' optreedt als de browser gesloten wordt? En dat PHP dat 'event' vervolgens opvangt zoals Java dat doet. Als er niets verstuurd wordt bij het afsluiten van de brouwser houdt het natuurlijk op. Ik ga voor een aparte window die de login-tijd weergeeft en bij het afsluiten van die window stopt met bijhouden van de tijd. Ik insert dan gewoon iedere minuut de END_TIME aan de hand van de LOGIN_TIME. Als de sessie doodgaat, gaat ook de LOGIN_TIME verloren en wordt er een nieuwe aangemaakt als er opnieuw ingelogd wordt.

Is dit wel een goede methode dan? Of zie ik foutjes over het hoofd? :P

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 14:40

TheDane

1.618

Op dinsdag 11 juni 2002 21:18 schreef Carnifex het volgende:
hmm, maar het had toch ook zo kunnen zijn dat er een 'event' optreedt als de browser gesloten wordt? En dat PHP dat 'event' vervolgens opvangt zoals Java dat doet. Als er niets verstuurd wordt bij het afsluiten van de brouwser houdt het natuurlijk op. Ik ga voor een aparte window die de login-tijd weergeeft en bij het afsluiten van die window stopt met bijhouden van de tijd. Ik insert dan gewoon iedere minuut de END_TIME aan de hand van de LOGIN_TIME. Als de sessie doodgaat, gaat ook de LOGIN_TIME verloren en wordt er een nieuwe aangemaakt als er opnieuw ingelogd wordt.

Is dit wel een goede methode dan? Of zie ik foutjes over het hoofd? :P
laten we nogmaals vragen waarom je dit wil doen, of heb ik daar overheen gelezen? waarom perse via een webinterface de login tijd bijhouden? Ieder zichzelf respecterend OS kan dit al doen op basis van de username waarmee je inlogt, inclusief je command history, mouse activity etc etc. En je internet activity wordt over het algemeen via je netwerk interface gelogd, dus waarom die registratie via je webinterface :?

  • Carnifex
  • Registratie: Januari 2000
  • Laatst online: 14-08 11:17
Omdat je dan bij iemand anders thuis kan gaan zitten werken op een pc die niet van jou is. De tijd wordt dan, via de website, op een centrale server bijgehouden.
ik d8 dat ik het al een beetje had vermeld 2 posts omhoog:
Het probleem is dat het vaak voorkomt dat we op een pc werken die niet van ons is maar wel internet heeft. Het leek mij makkelijk om bij te houden hoeveel we werken via een website: alleen ff inloggen en je tijd wordt bijgehouden en je kunt aan de slag.

Verwijderd

Sorry hoor, maar die andere oplossingen zijn wellicht wel beter en veiliger, maar ook een stuk ingewikkelder.

Wat ik zei met die pop-up, kan ook anders met bv. hulp van een iframe. Lijkt mij een vrij simpele en doeltreffende oplossing..

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 14:40

TheDane

1.618

Op dinsdag 11 juni 2002 22:19 schreef Carnifex het volgende:
Omdat je dan bij iemand anders thuis kan gaan zitten werken op een pc die niet van jou is. De tijd wordt dan, via de website, op een centrale server bijgehouden.
ik d8 dat ik het al een beetje had vermeld 2 posts omhoog:
[..]
doh |:(

sorry, inderdaad overheen gelezen
maargoed, ze moeten dan wel de discipline hebben om die website 'aan te zetten' .. en netjes weer uit te loggen als ze klaar zijn.

misschien dat je dan toch beter kan denken aan een gewone niet-webapplicatie, die je in je startup sequence zet. die software kan dan bijhouden welke gebruiker wanneer inlogt op 't systeem, en ook wanneer ie uitlogt of niet meer actief is.

Ik denk dat zo'n applicatie veel betrouwbaarder is dan een webinterface.

een iframe of popupje oid kan ook wel, maar 't lijkt mij een -onbetrouwbare- omweg

  • Martin Sturm
  • Registratie: December 1999
  • Laatst online: 01-09 16:14
Je kunt toch je eigen sessionhandler maken in php? Sterker nog, dat weet ik wel zeker. En volgens mij is er ook een event die vaststelt dat de sessie beeindigd is (dit kan 'geforceerd' zijn (logout knop) of andere oorzaak (timeout, sluiten van browser enz).

http://www.php.net/manual/en/function.session-set-save-handler.php
Pagina: 1