inactieve gebruikers verwijderen na een uur

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Innovatieve, nauwkeurige Senior PHP Developer voor

Eind jaren ’90 is dit bedrijf opgericht. Ze hebben zich altijd beziggehouden met het ontwikkelen van software voor overheidsinstanties. Dit zijn instanties waaronder bijvoorbeeld ook onder andere : de belastingdienst, burgerszaken, verschillende bedrijven, notarissen, incassobureau’s en ook nog bewindvoerders. Momenteel tellen ze 20 medewerkers, waarvan 2/3 deel allemaal developers zijn. Doordat ze de enigste aanbieder van dit soort software op de markt zijn, groeien ze erg hard. Door de enorme groei, hebben ze dan ook concrete groeiplannen in het verschiet. Functie-omschrijving Het bedrijf wordt door allerlei instanties ingeschakeld. Tegenwoordig wordt alles digitaal geregeld en gezien de essentie van dit soort

Bekijk vacature »

Daniel van Seggelen

Daniel van Seggelen

07/04/2017 10:49:23
Quote Anchor link
Weet iemand de snelste/ beste manier met zomin mogelijk serverload om te kijken wanneer een gebruiker voor het laatst actief was en als dat meer dan een uur is dat hij hem op offline zet?

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?
 
PHP hulp

PHP hulp

17/12/2018 21:44:09
 
Ward van der Put
Moderator

Ward van der Put

07/04/2017 11:14:34
Quote Anchor link
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.
 
Ivo P

Ivo P

07/04/2017 11:39:17
Quote Anchor link
ik zou zeggen:

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
 
- Ariën -
Beheerder

- Ariën -

07/04/2017 11:51:00
Quote Anchor link
En zo een SELECT-actie hoeft echt niet via een cronjob, die kan je prima bij elke actie op de site uitvoeren.
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 -
 
Daniel van Seggelen

Daniel van Seggelen

07/04/2017 12:26:10
Quote Anchor link
Bedankt voor de reacties.

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
 
Ward van der Put
Moderator

Ward van der Put

07/04/2017 12:47:10
Quote Anchor link
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.
 
- Ariën -
Beheerder

- Ariën -

07/04/2017 12:59:35
Quote Anchor link
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).
 
John D

John D

07/04/2017 13:02:30
Quote Anchor link
Daarnaast is het zo dat gebruikers ook niet vrolijk worden van het onvrijwillig ongevraagd sluiten van browsers.
 
Daniel van Seggelen

Daniel van Seggelen

07/04/2017 13:26:31
Quote Anchor link
@ward

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)
PHP script in nieuw venster Selecteer het PHP script
1
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
                ?>

<script>
window.location = '
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?=$url?>
';
</script>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));

            }
        }
        
      
}
 
Ivo P

Ivo P

07/04/2017 13:26:45
Quote Anchor link
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.


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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.