[php] online bezoekers weergeven.

Pagina: 1
Acties:
  • 115 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een soort van chatbox na te bouwen. Op een pagina wil ik de namen(waarmee ze ingelogd zijn) van de bezoekers weergeven.

De namen moeten verdwijnen als de bezoekers zich niet meer op de pagina bevinden.

Om de 5 seconde refresh ik de pagina, dan gebeurt er hetvolgende:
De huidige tijd wordt in de db (MySQL) gezet bij de bezoeker met de juiste id (wordt uit een sessie gehaald).
Alle bezoekers worden uit de db verwijderd waar hun tijd ouder is dan 5 seconde.
De namen van de overgebleven bezoekers worden uit de db gehaald en weergegeven.

Zoals jullie als geen ander begrijpen is dit nogal server misbruik.

Ik heb me de laatste tijd hierin verdiept, maar ik kon geen goede oplossing vinden.
Ik heb over Cron Jobs nagedacht, maar deze mag ik niet gebruiken.
ASP heeft een mooie functie (Session_OnEnd oid), maar ik heb geen ASP ervaring en ik moet het morgen afmaken. Ik heb meerdere malen gelezen dat PHP zo'n functie niet heeft.

Als laatste vond ik de functie session_set_save_handler(), maar hier snap ik geen kont van. Een beetje onduidelijke uitleg op php.net. Wanneer wordt nou bijv. string close aangeroepen?

Samenvatting:
Is er een betere manier dan dat ik nu gebruik?
Wat is deze manier?
Hoe werkt session_set_save_handler() en kan ik deze hievoor gebruiken?

Bij voorbaat dank!! :)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Je zou wanneer iemand een pagina verlaat een javascriptje aan kunnen roepen wat een request verstuurt aan een soort 'logout' pagina.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb idd ook aan JS gedacht, deze heeft een mooie functie als de pagina gesloten wordt. Maar wat als de gebruiker's computer vastloopt of deze de computer gewoon uitzet?

Verder wil ik liever ook geen ongewenste popup gebruiken.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Dan zou je aan de clientside idd met een bepaalde interval kunnen refreshen om aan te geven dat de user nog online is. Zet een cronjob op die om de 10 seconden checkt of er nog wel van alle users input is gekomen. Zo niet, user verwijderen uit lijstje, zo wel, niks doen.

Erg ingewikkeld lijkt me dat toch niet?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[knip en plak uit de bovenstaande tekst]
Ik heb over Cron Jobs nagedacht, maar deze mag ik niet gebruiken
[/knip en plak uit de bovenstaande tekst]

Helaas...

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

sorry, heb ik overheen gelezen...

In dat geval zou ik bij elke request nakijken hoe lang het is geleden dat de laatste update is gedaan over welke users online zijn. Is dit meer dan 10 seconden, doe dan wederom een update, zo niet, geen update doen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
drm schreef op 28 december 2002 @ 14:02:
sorry, heb ik overheen gelezen...

In dat geval zou ik bij elke request nakijken hoe lang het is geleden dat de laatste update is gedaan over welke users online zijn. Is dit meer dan 10 seconden, doe dan wederom een update, zo niet, geen update doen.
Sorry, dit volg ik niet helemaal?
Dit lijkt me niet echt een effectievere oplossing dan die ik al had.
Dan moet je alsnog je eigen tijd in de db zetten ed.

[ Voor 14% gewijzigd door Verwijderd op 28-12-2002 14:24 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Kijk:

users-online.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
open ( time.txt )
$lastOpened = trim ( inhoud van time.txt );
sluit time.txt
$now = time ()
if ( $now - $lastOpened > 10 ) { //
   foreach ( users uit de database die online zou moeten zijn ) {
      if ( $now - user [ laatste request ]  > 5 ) {
         user niet meer online, dus verwijderen
      }
   }
   open ( time.txt )
   schrijf $now naar time.txt
   sluit ( time.txt );
}

update set lastrequest=$now where userID=userID_die_request_deed;

foreach ( user uit database die online is ) {
   echo user
}


zoiets bedoel ik.

[ Voor 3% gewijzigd door drm op 28-12-2002 14:44 ]

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Suepahfly
  • Registratie: Juni 2001
  • Laatst online: 17-09 17:05
http://members.lycos.nl/yabba/yabba.zip dacht ik
Compleet forum inclusief online user scriptje (php/mysql)

Ga anders ff in de script library van phpfreakz.nl zoeken

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Suepahfly >
offtopic:
Heel leuk en aardig, maar 't is hier niet de bedoeling dat we een beetje scripts uit gaan zitten wisselen. Hier maken we de scripts, en praten we over het maken ervan. Laat dergelijke replies voortaan dus maar even achterwege.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Allebei bedankt, maar toch zijn dit niet de oplossingen die ik nodig heb.

Ik werk niet met een tekstfile maar met een database en als ik dan de tijd opvraag van wanneer de laatste aanpassing is geweest, dan kan ik net zo goed een query loslaten die iedereen verwijderd die er niet meer zijn.

De online scripts die ik gezien heb bij phpfreakz zijn allemaal niet bruikbaar. Ze controleren maar 1x in de 20 minuten en laten meestal de bezoekers in de database staan en geven alleen de nieuwe bezoekers (jonger dan 20 minuten) weer.

Dit is de code die ik elke 5 sec bij iedere bezoeker laat uitvoeren en deze zou ik graag minder intensief maken:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
    //timestamp(jaar, maand, dag, uur, minuut, seconde) van nu maken.
    $nu = date("YmdHis", strtotime("now"));

    //Tijd upwaarderen, zodat deze speler actief blijft.
    $query = "Update speler SET tijd = '$nu' WHERE id = '$spelerID'";
    $MQ = mysql_query($query) or die (error($query, $HTTP_SERVER_VARS['PHP_SELF']));

    //timestamp(jaar, maand, dag, uur, minuut, seconde) van 1 minuut geleden maken.
    $verleden = date("YmdHis", strtotime("-1 minute"));

    //Popup bericht weergeven voor deze speler.
    $query = "SELECT id, bericht FROM popup WHERE idspeler = '$spelerID' LIMIT 1";
    $MQ = mysql_query($query) or die (error($query, $HTTP_SERVER_VARS['PHP_SELF']));

    while($row = mysql_fetch_array($MQ))
    {
        print "<script>popWindow('".$row[bericht]."');</script>";

        //De popup verwijderen.
        $query2 = "DELETE FROM popup WHERE id = '$row[id]'";
        $MQ2 = mysql_query($query2) or die (error($query2, $HTTP_SERVER_VARS['PHP_SELF']));
    }

    //Alle spelers selecteren waarbij hun tijd langer dan een minuut niet geupdate is.
    $query = "SELECT id FROM speler WHERE tijd < '$verleden'";
    $MQ = mysql_query($query) or die (error($query, $HTTP_SERVER_VARS['PHP_SELF']));

    while($row = mysql_fetch_array($MQ))
    {
        //Als de speler een groepsleider is, dan alle spelers die in de groep zitten weer in de wachtkamer zetten.
        $query2 = "SELECT speler.id FROM speler, groep WHERE groep.leider = $row[id] && speler.idgroep = groep.id";
        $MQ2 = mysql_query($query2) or die (error($query2, $HTTP_SERVER_VARS['PHP_SELF']));

        while($row2 = mysql_fetch_array($MQ2))
        {
            $query3 = "Update speler SET idgroep = '0' WHERE id = '$row2[id]'";
            $MQ3 = mysql_query($query3) or die (error($query3, $HTTP_SERVER_VARS['PHP_SELF']));
        }

        //De groep van de speler verwijderen.
        $query2 = "DELETE FROM groep WHERE leider = '$row[id]'";
        $MQ2 = mysql_query($query2) or die (error($query2, $HTTP_SERVER_VARS['PHP_SELF']));

        //De speler zelf verwijderen.
        $query2 = "DELETE FROM speler WHERE id = '$row[id]'";
        $MQ2 = mysql_query($query2) or die (error($query2, $HTTP_SERVER_VARS['PHP_SELF']));
    }

    //Alle spelers in de wachtkamer weergeven.
    print "<table cellspacing=\"1\" cellpadding=\"3\">";

    $query = "SELECT id, naam FROM speler WHERE actief = '0' && idgroep = '0'";
    $MQ = mysql_query($query) or die (error($query, $HTTP_SERVER_VARS['PHP_SELF']));

        print "<tr>";
            print "<td class=\"kop\">Spelers in wachtkamer:</td>";
        print "</tr>";

    while($row = mysql_fetch_array($MQ))
    {
        print "<tr>";
            print "<td>$row[naam]</td>";
        print "</tr>";
    }

    print "</table><BR>";

    //Alle groepen + spelers weergeven.
    $query = "SELECT id, naam, aantal, leider FROM groep";
    $MQ = mysql_query($query) or die (error($query, $HTTP_SERVER_VARS['PHP_SELF']));

    while($row = mysql_fetch_array($MQ))
    {
        print "<table cellspacing=\"1\" cellpadding=\"3\">";
            print "<tr>";
                print "<td><u>$row[naam]</u> wil spelen met <u>$row[aantal]</u> mensen.</td>";
            print "</tr>";

            $query2 = "SELECT id, naam FROM speler WHERE idgroep = '$row[id]'";
            $MQ2 = mysql_query($query2) or die (error($query2, $HTTP_SERVER_VARS['PHP_SELF']));

            while($row2 = mysql_fetch_array($MQ2))
            {
                print "<tr>";
                    print "<td>";
                    if($row2[id]==$row[leider])
                    {
                        print "* $row2[naam]";
                    }
                    else
                    {
                        print $row2[naam];
                    }
                    print "</td>";
                print "</tr>";
            }
        print "</table><BR>";
    }
    ?>

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 07:32
Is dit niet een ideale toepassing om sockets te gebruiken, zodra de verbinding wegvalt verwijder je de gebruiker gewoon weer.

Acties:
  • 0 Henk 'm!

  • Funcracker
  • Registratie: Juni 2001
  • Laatst online: 07-03-2024

Funcracker

The LedZ Collective

je kunt ook je php sessions in een db gaan opslaan,
Je kunt dan in de db gewoon de lopende sessions opvragen,
het blijft (en zal ook altijd blijven ben ik bang, HTTP is namelijk stateless) dat je een time-out hebt van een x aantal seconden en er dus mensen weg kunnen zijn en nog wel in de online lijst staan.

Als het een java applet is kun je dan die applet niet herschrijven zodat je aan de applet vraagt wie online zijn?
Dan klopt het wel prob.

I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 07:32
met een applet is het idd niet zo'n probleem. ZOu je hiervoor goed sockets kunnen gebruiken?

Acties:
  • 0 Henk 'm!

  • Funcracker
  • Registratie: Juni 2001
  • Laatst online: 07-03-2024

Funcracker

The LedZ Collective

je kunt de applet ook een textfile (of xml of..) laten genereren als er iemand inlogt of verdwijnt.

I am one hell of a guy, I can do anything I want, only I just don't have the faintest idea what.
Zaphod Beeblebrox, in The Hitch Hiker's Guide To The Galaxy


Acties:
  • 0 Henk 'm!

Verwijderd

offtopic:
Oeps, die 2 posts moesten van mij zijn ;)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Dit begint zo langzamerhand een beetje een script-uitwissel topic te lijken.... Ik stel voor dat er nu commentaar komt op de code die de topicstarter gepost heeft, want anders heb ik weinig hoop voor dit topic....

Geen scriptlinkjes meer posten, dus, aub

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 07:32
Je kunt toch ook iets van flush control toepassen, dan stuur je bijvoorbeeld steeds een lege string naar iedereen. Als die string niet verstuurd kan worden weet je dat de bezoeker weg is.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Hoe kan je iets naar de user sturen als de user er niet om gevraagd heeft in HTTP, dan :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • RedHat
  • Registratie: Augustus 2000
  • Laatst online: 17-09 20:43
ik zou met db een lastActivity field doen

elke meta http evec refresh updaten, if langer als 10 minuten niet geupdate >> user is offline

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 07:32
Je kan een pagina toch in delen versturen, in Perl kan dat tenminste, je laat dan de pagina gewoon steeds met een tussenpoos vane en seconde of 5 een deeltje versturen, kan al een spatie " " zijn.

Acties:
  • 0 Henk 'm!

  • Prutser_IA
  • Registratie: Januari 2000
  • Laatst online: 03-06-2021

Prutser_IA

<*{{{><

Eens kijken, heb zoiets ook gemaakt...
Wat ik gedaan heb is vrij eenvoudig..
1. Iemand logt in ==> deze tijd wordt opgeslagen.
2. Bij elke pagina wordt deze tijd geupdatetet.
3. Bij het uitloggen wordt de huidige tijd met 5 minuten verlaagd. ( dit omdat er een verloop van 5 minuten inzit, en ik op deze manier ook bij kan houden wie wel en niet actief is.. )

Owkee, dit is het stukje registratie.. Natuurlijk wil je dit ook weer opvragen..
1. Bij het parse van de pagina (dus al iemand deze opvraagd) kijk je welke mensen korter dan 5 minuten geleden actief was (dus tijd_in_db > now()-5min)..

Natuurlijk is dit niet geheel real-time.. maar een verloop van 5 minuten vindt ik redelijk... Natuurlijk kan je hier ook 1 minuut van maken..
Verder lijkt me een refresh niet echt nodig, zodra ik een pagina oproep krijg ik de huidige contents te zien (op dat moment) als ik wil weten of er iets veranderd is, dan ram ik op F5..

Dus zoiets lijkt me gewoon de meest eenvoudige oplossing... Je moet denk ik beetje afwegen wat je wilt.. gewoon beetje bij houden wie online is, of een echt realtime oplossing (wat vrij lastig is met php) die redelijk veel van je server trekt

42


Acties:
  • 0 Henk 'm!

  • KneoK
  • Registratie: December 2001
  • Laatst online: 01:21

KneoK

Not in a million lightyears

djluc schreef op 30 december 2002 @ 13:05:
Je kunt toch ook iets van flush control toepassen, dan stuur je bijvoorbeeld steeds een lege string naar iedereen. Als die string niet verstuurd kan worden weet je dat de bezoeker weg is.
Ik zou het omdraaien. Dus een javascriptje bij de client laten draaien die om de x seconden een stringetje naar een centraal script stuurt.
Elke user wordt bij het aanmelden gelogd. Als er dan tweemaal (bijvoorbeeld) niets van een bepaalde user wordt ontvangen dan wordt deze uit de DB verwijderd.

Je kunt dan de lijst laten refreshen als er een gebruiker wordt verwijderd oid.
Pagina: 1