inactieve gebruikers verwijderen na een uur
Ik zat te denken aan een activiteiten log, om elke pagina die een gebruiker bekijkt, de tijd ervan op te slaan en dan een cronjob laden die elke 30 min bijv. kijkt of een uur overschreven is dat er activiteit is?
Of is er een simpelere manier?
Is hier een script voor dat iemand weet?
Daniel van Seggelen op 07/04/2017 10:49:23:
[…] met zomin mogelijk serverload […]
Als dat het doorslaggevende criterium is, laat je het niet alleen de server maar vooral de clients doen: via de sessieduur, zodat vanzelf een time-out optreedt.
1 tabel met daarin 2 kolommen
userid
lastactive (datetime)
Bij elke activiteit van een user zorg je dat de lastactive kolom bijgewerkt wordt.
Je gaat niet bijhouden of iemand online is of offline.
Je zoekt de gebruikers die online zijn, door een SELECT te doen op deze tabel met WHERE lastactive > NOW() - INTERVAL 30 MINUTE
Geen proces op de achtergrond om dat voor iedereen te bepalen. Dan bepaal je dat waarschijnlijk de hele nacht door elke minuut, terwijl er geen mens gaat kijken.
--
Ik zou kiezen voor een losse tabel en niet de tabel users.
Als je namelijk steeds loopt te klieren met de inhoud van de afzonderlijke records in de tabel users, dan zal je database die niet gaan cachen: immers de records zijn steeds veranderlijk
Het is voor MySQL weinig werk om te kijken welke lastactivetime's ouder zijn dan 30 minuten.
Persoonlijk vind ik 30 minuten wel veel. Ik vind dat ze na 10 minuten inactiviteit (volgens de lastactive veld) echt wel niet-actief zijn. Of je moet op je site iets hebben waar ze vaak lang bezig zijn door op één pagina te blijven (typen van een ellenlange review).
Voor mijn vroegere community had ik de timeout op 5 minuten staan.
Gewijzigd op 07/04/2017 11:51:36 door - Ariën -
Het punt is dat elke gebruiker wel de site bezocht moet hebben, wanneer de laatste activiteit bijgehouden word.
Ik wil dus een mogelijkheid, dat wanneer een gebruik inlogt, vervolgens de browser sluit en een half uur of een uur niet meer de site bezoekt, dat hij/zij automatisch uitgeschreven word.
Als men binnen 10min wel de website opent, dat hij/zij ingelogd blijft.
Gewijzigd op 07/04/2017 12:31:21 door Daniel van Seggelen
Daarvoor zijn sessies bedoeld. De functionaliteit die je noemt, zit standaard in PHP-sessies en, minstens zo belangrijk, in browsers: als je de browser sluit en binnen de sessieduur opnieuw opent, wordt de sessie hervat via het sessiecookie.
Die sessies lijken mij meer van toepassen op het inlogmechanisme. Voor het bijhouden in een overzicht is het handig om per gebruiker de LastActive tijd op te slaan in een aparte tabel (voor het 'Wie is er online'-overzicht), en eventueel ook in de ledentabel ('Wanneer was hij/zij voor het laatst online' op de profielpagina).
Daarnaast is het zo dat gebruikers ook niet vrolijk worden van het onvrijwillig ongevraagd sluiten van browsers.
Quote:
Daarvoor zijn sessies bedoeld...
Maar dat werkt niet zoals ik wil. Ik heb dat al getest.
Als men gewoon de browser sluit en ik kijk naar de database of ga met een ander apparaat naar de website dan zie ik nog steeds dat deze persoon online is.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$timeout = 1*60;//1 min om te testen
if ($_SESSION['sesId']!='') // als men is ingelogt
{
if (!isset($_SESSION['sessionTime'])) {
$_SESSION['sessionTime'] = time() + $timeout;//first login, set timeout
} else {
if ($_SESSION['sessionTime'] < time()) {//over timeout, destroy session
// session timed out
$r = mysqli_query($DBD->conn(),"UPDATE members set login = 0, lastonline = '".date("Y-m-d H:i:s")."' WHERE id = '".$_SESSION['sesId']."'");
$rdd = mysqli_query($DBD->conn(),"DELETE from current WHERE member_id = '".$_SESSION['sesId']."'");
session_destroy();
unset($_SESSION);
session_unset();
@$_SESSION = array(); // Clears the $_SESSION variable
?>
if ($_SESSION['sesId']!='') // als men is ingelogt
{
if (!isset($_SESSION['sessionTime'])) {
$_SESSION['sessionTime'] = time() + $timeout;//first login, set timeout
} else {
if ($_SESSION['sessionTime'] < time()) {//over timeout, destroy session
// session timed out
$r = mysqli_query($DBD->conn(),"UPDATE members set login = 0, lastonline = '".date("Y-m-d H:i:s")."' WHERE id = '".$_SESSION['sesId']."'");
$rdd = mysqli_query($DBD->conn(),"DELETE from current WHERE member_id = '".$_SESSION['sesId']."'");
session_destroy();
unset($_SESSION);
session_unset();
@$_SESSION = array(); // Clears the $_SESSION variable
?>
<script>
window.location = '';
</script>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
<?php
} else {
session_regenerate_id(true);
$_SESSION['sessionTime'] = time() + $timeout;//login in timeout, reset timeout
$url = reset(explode('?', HTML_ROOT));
}
}
}
} else {
session_regenerate_id(true);
$_SESSION['sessionTime'] = time() + $timeout;//login in timeout, reset timeout
$url = reset(explode('?', HTML_ROOT));
}
}
}
Daniel van Seggelen op 07/04/2017 12:26:10:
Het punt is dat elke gebruiker wel de site bezocht moet hebben, wanneer de laatste activiteit bijgehouden word.
Ik wil dus een mogelijkheid, dat wanneer een gebruik inlogt, vervolgens de browser sluit en een half uur of een uur niet meer de site bezoekt, dat hij/zij automatisch uitgeschreven word.
Als men binnen 10min wel de website opent, dat hij/zij ingelogd blijft.
Ik wil dus een mogelijkheid, dat wanneer een gebruik inlogt, vervolgens de browser sluit en een half uur of een uur niet meer de site bezoekt, dat hij/zij automatisch uitgeschreven word.
Als men binnen 10min wel de website opent, dat hij/zij ingelogd blijft.
Uiteraard heeft hij de site bezocht. Maar zo niet, dan zal zijn user-id niet een de tabel voorkomen.
zodra je controleert of de user niet te lang afwezig was:
SELECT COUNT(1) FROM useractivteit WHERE user_id = 123 AND lastactive > NOW() - INTERVAL 30 MINUTE;
Vind je hier een waarde > 0, dan was hij actief in de laatste 30 minuten.
Vind je hem niet, dan was het ofwel meer dan 30 minuten, ofwel komt hij helemaal niet voor in de lijst.