Users Online

Door Marien xD, 23 jaar geleden, 10.351x bekeken

Om als eerste mee te beginnen: Ik heb dit script niet helemaal zelf gemaakt. Ik heb een groot deel vanaf een andere site. De credits gaan dan ook uit naar die onbekende persoon.

Ik zal zijn toelichting hier ongeveer vertalen:

Stap voor stap weergave van het script:

1. Neem de eerste 3 reeksen van het IP (nnn.nnn.nnn)
2. Voeg de rij toe aan de database
3. Verwijder oude rijen
4. Tel de online users

1. Waarom de eerste 3 reeksen van een IP?
Dit is voor proxies, zoals de AOL proxy, AOL gebruikers krijgen een IP adres uit een reeks IP's welke bij de proxy hoort. Normaal blijft een ip een hele sessie hetzelfde, maar met proxy's kan elke HTTP request een ander IP zijn. Maar meestal behoren deze IP's aan een bepaald subnet dus de eerste 3 reeksen zijn dan hetzelfde.

2. Waarom een loop en een timestamp toevoeging
Sinds dat de key van de tabel timestamp is, moet de timestamp uniek zijn. Soms treden er fouten op, een gebruiker krijgt een timestamp en de andere een error dat de key al bezet is.. Om dit te onderdrukken gebruiken we het @ teken om een error tegen te houden, tellen we bij de timestamp 1 of 2 op en voegen we hem opnieuw toe. Maar die herhaling word beperkt tot 3 voor de sites die een GROTE hoeveelheid traffic krijgen.

3. Verwijder oude rijen
Het script zal elke rij checken of het binnen de toegelaten tijd valt. Zo niet, de rij zal worden verwijderd.

4. Laat de teller zien
Selecteer het aantal van unieke IP's in de tabel. Tel het op en geeft het resultaat weer van de online gebruikers.


De SQL tabel

** Wees er zeker van dat je dit heb toegevoegd aan de database voordat je het script draait
CREATE TABLE `useronline` (
`timestamp` int(15) NOT NULL default '0',
`ip` varchar(40) NOT NULL default '',
`file` varchar(100) NOT NULL default '',
PRIMARY KEY (`timestamp`),
KEY `ip` (`ip`),
KEY `file` (`file`) ) TYPE=MyISAM;

Dit was de toelichting van de officiele maker, ik heb er niets aan toe te voegen. (misschien klopt de vertaling niet maar je snapt het wel :))

Include het bestand gewoon op de pagina's waarop je wilt tellen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? include "online.php"; ?>


De connectie variabelen kan je weglaten als je voor dit script al een database connectie heb.

Voorbeeld: http://www.sitsat.nl/phphulp/usersonline/online.php

Gesponsorde koppelingen

PHP script bestanden

  1. users-online

 

Er zijn 20 reacties op 'Users online'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Han eev
Han eev
23 jaar geleden
 
0 +1 -0 -1
Mooi script! wat heb je er zelf aan verandert dan?
Marien xD
Marien xD
23 jaar geleden
 
0 +1 -0 -1
wat cosmetische dingen :) volgordes (bijv de mysql connectie) en hoe de gebruikers worden weergegeven (dit is korter) en de mysql hoofdletters gebruikt ipv alles kleine letters ;)
Jelmer -
Jelmer -
23 jaar geleden
 
0 +1 -0 -1
Ipv een timestamp kan je ook microtime gebruiken. Dan wordt de kans dat twee gelijk zijn wel erg klein.
En als ik het dus goed begrijp is het zo dat waneer er meerdere mensen tegelijk online zijn, maar de eerste drie delen van hun ip met elkaar in gemeen hebben, ze worden gezien als 1?
Marien xD
Marien xD
23 jaar geleden
 
0 +1 -0 -1
jup, ik heb het script ook niet zelf gemaakt, vond het een goed idee om deze opzet met iedereen te delen hier op de site, hij is erg compact :)
Jordi
Jordi
23 jaar geleden
 
0 +1 -0 -1
Ziet er wel leuk uit, maar ik denk dat dit een beetje fout is:
while($loopcap<3 && @mysql_query("INSERT INTO useronline VALUES('". $timestamp ."','". $ip ."','". $_SERVER['PHP_SELF'] ."')"))

Want nu gaat hij het drie keer herhalen als het goed gaat. Er moet denk ik even een uitroepteken voor de @mysql_query.

Verder vind ik het wel slim bedacht om alleen de eerste drie getallen van het ip-adres te gebruiken, maar aan de andere kant, kan het zo natuurlijk ook zo zijn dat twee mensen voor één persoon worden aangezien. En is het echt mogelijk dat de ip van een proxy verandert zonder reconnect? Als het al kan, lijkt de kans me bijzonder klein, ook omdat tegenwoordig bijna iedereen breedband heeft.
Maar als je toch aan het kijken bent naar welke users online zijn, dan kun je toch ook gewoon hun usernaam of -id opslaan in plaats van het ip-adres?

Verder moet ik wel zeggen dat ik het een mooi, compact script vind.
Stefan
Stefan
23 jaar geleden
 
0 +1 -0 -1
Dank =) werkt perfect! Super!


23 jaar geleden
 
0 +1 -0 -1
Hey pplz,

nice script, indeed herschrijven met id / username als koppeling naar de gebruikerstabel zou een N.I.C.E. idee zijn.

Ik ben het eens met het punt dat je niet 3 x die loop moet doen.

Als iemand vanaf AOL/of whatever komt, kun je dit simpel vaststellen tijdens het aanmelden en vanaf daar met n statement t IP zonder t laatste deel toevoegen aan de usersonline, MAAR wel met een userid.
Zo kan je toch vaststellen of iemand nog online is, maar dan de volgende vraag:


>>> Waarom b.v. een IP gebruiken als je simpel een username / timestamp kunt gebruiken hiervoor.
De controlle wie iemand vanaf IP x is, doe je tijdens de login, dus de combinatie userid-name / logintimestamp is alles wat je nodig hebt om een online users lijst te genereren.


Lijk mij een must om gebruikers niet samen te laten vallen op 1 (niet compleet) ip om indeed "verwaring" te voorkomen.


Ik heb op een van m'n sites ook zoiets in gebruik, enige verschil is dat de usersonline tijdens login gevult wordt en dus zonder IP werkt.

Elke keer als een bezoeker een pagina opvraagt wordt de countdown opnieuw naar 2 minuten (bij mij 3) gezet voor Die user.
Mocht iemand effe weglopen, np > klik en je bent weer active.

Enige wat m'n script dan doet is een select vanuit de online users WHERE timestamp > $now-180 en dan de display. (zo ontkom je aan de DISTINCT / extra query)
(een cron script dumpt de te oude listings in de table.)

verder is ie toppie.
Jelmer -
Jelmer -
23 jaar geleden
 
0 +1 -0 -1
@Robin: jij telt dus alleen de mensen die zijn ingelogd op je site. Bezoekers worden dus genegeerd.


23 jaar geleden
 
0 +1 -0 -1
@ Jelmer,

True, voor die site wel,

"bezoekers" tel en display ik indeed via bijna t zelfde idee,

Alleen, omdat de site die ik gemaakt heb bijna alleen nederlandse bezoekers aantrekt die thuis of op t werk zitten, gebruik ik het hele ip,

t is of zo om of andersom zo om,

wat eigenlijk t beste is, is in mysql of file het sessie id opnemen, dat koppelen aan een tijd en een ip, zo kan je in principe de gebruiker blijven tracken met ze sessie id, stom(niet aan gedacht), want dat heb ik op n andere site gemaakt,
mocht z'n ip veranderen, dan vergeet je dat en ga je alleen verder met browserid/timestamp. (phpsessid = uniek en wordt tijdens je bezoek gelijk aangemaakt).
Marien xD
Marien xD
23 jaar geleden
 
0 +1 -0 -1
moet je wel een site hebben met sessions :)


23 jaar geleden
 
0 +1 -0 -1
Waarom niet gewoon een id aan de tabel toevoegen die uniek is? Dan heb je niet dat probleem dat timestamps gelijk kunnen zijn...


23 jaar geleden
 
0 +1 -0 -1
@ Marien

true,

nothin

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7


won't fix, maar ur right.

Enige echt unieke is t sessie id, maar als je daar echt niet mee Wil werken, dan moet je wel terugvallen op t IP.

t zijn maar ideeen :)
Marien xD
Marien xD
23 jaar geleden
 
0 +1 -0 -1
Ik heb het script eigenlijk ook alleen maar vertaald, ik zag ook dat het goed werkte :)

Maar okeej dat zijn alle mogelijkheden, maar deze is echt super compact :)


23 jaar geleden
 
0 +1 -0 -1
Pracht script echt geweldig :D
Crispijn -
Crispijn -
23 jaar geleden
 
0 +1 -0 -1
Waarom is tijd eigenlijk ingesteld op 120 seconde? Wanneer je het op 1 seconde insteld is het toch veel preciezer? Of heeft dit met de hoeveelheid verkeer/processor capaciteit te maken?

Ik heb nl dit script aangepast dat het ook met online leden werkt. Hele eenvoudige aanpassing. Het lijkt me nu handig dat wanneer er 1 lid online is, en je logt uit je dan ook direct ziet dat er geen leden meer online zijn.

Ik ben benieuwd...
Pieter van Linschoten
Pieter van Linschoten
23 jaar geleden
 
0 +1 -0 -1
Als je een pagina bekijkt, dan ben je al weer langer dan een seconden niet actief. Hij zou dan alleen de mensen online weergeven die een fractie van een seconde eerder klikten dan jij.

Het script heeft als timeout 120 seconden, en ben je daarna niet actief, dan wordt je als offline beschouwd
Crispijn -
Crispijn -
23 jaar geleden
 
0 +1 -0 -1
Ah, check. inderdaad. Ik ben gaan testen en je hebt gelijk. Bedankt voor de tip!

Wanneer iemand behoefte heeft aan mijn aangepaste script: PM me maar.
Lasse
Lasse
22 jaar geleden
 
0 +1 -0 -1
Mooi script!
Unknown unknown
unknown unknown
20 jaar geleden
 
0 +1 -0 -1
Waarom niet een update aan de timestamp als je opnieuw actief word op de site en je nog in de lijst staat?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Citroen Anoniem Graag
Citroen Anoniem Graag
20 jaar geleden
 
0 +1 -0 -1
Waarom geen id met auto_increasement als primary key ipv een timestamp?

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. users-online

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.