11. juli 2005 - 23:37Der er
35 kommentarer og 1 løsning
Online / ofline system
Jeg har gået og tænk meget længe over hvordan man kan lave et online / ofline system til mit brugersystem så man kan se om de er online eller ofline nogen der kan hjælpe mig med det ?
Den moderne arbejdsplads er i stigende grad afhængig af mødelokaler til at fremme samarbejde, men dette skift medfører også stigende sikkerhedsudfordringer.
Hvis du bruger en database baseret session handler, kan du med fordel indbygge online/offline tracking deri, så status bliver opdateret sammen med session information
Du skal bruge funktionen session_set_save_handler() bool session_set_save_handler(string open, string close, string read, string write, string destroy, string gc)
Manual siden har et udmærket eksempel på, hvordan du bygger en fuld session handler. Hver parameter til funktionen er navten på en funktion du selv har skrevet, der udfører en enkelt handling på en session (åbn, luk, læs, skriv, slet og ryd op) Hvis du hellere vil have det samlet i et objekt, kan jeg give dig noget af mit kode, som du kan bruge. Du kan indsætte dine brugeroplysninger for online brugere, i samme funktion som den du bruger til at oprette en session, og du kan f.eks. sætte dem offline i garbage collection funktionen. Du kan desuden styre hvor længe en session skal vare, og hvor ofte garbage collection funktionen skal køres. Jeg skal forresten lige tilføje at det ikke er nødvendigt at bruge databasen til sessions for at det her skal virke. Du kan sagtens bruge filer, eller memcache hvis du er lidt fancy ;)
Jow, det er klart at du på alle sider skal have en fil, der først indsætter brugerens navn og tidpunkt, hvis han ikke er i tabellen allerede, og dernæst sletter med førnævnte linie dem der har været inaktive.
Hvis du har mange brugere/hits, vil det blive tungt at opdatere databasen hver gang, hvilket ville ske hvis du bare satte det ind i index.php Men du kan jo blande et eller andet tilfældigheds noget ind i det, så databasen kun bliver opdateret en gang imellem.
Jeg har i mine systemer altid en tabel der hedder noget i stil med online_users hvor jeg kun gemmer bruger id, og tidspunktet for brugerens sidste handling.
Jeg havde selv lidt svært ved at få det hele til at spille den første gang jeg rodede med det, men det er egentligt ret simpelt, og som jeg ser det, noget alle får bruger for før eller senere ;)
Det skal dog siges at jeg i mit eget system sætter brugere online i en anden klasse, som udelukkende er til brugervalidering. Jeg har også lidt genvejsfunktioner og konstanter, så det er ikke noget der bare virker uden tilpasning. Jeg bruger desuden PHP5 og Postgres :)
$q = mysql_query(" SELECT * FROM tabel WHERE `brugernavn` = '".$_SESSION['brugernavn']."' ");
if(mysql_num_rows($q) == 0) { mysql_query(" INSERT INTO tabel (tid, brugernavn) VALUES (NOW(),'".$_SESSION['brugernavn']."') "); } else { mysql_query(" UPDATE tabel SET `tid` = NOW() WHERE `brugernavn` = '".$_SESSION['brugernavn']."' "); }
mysql_query(" DELETE FROM tabel WHERE date_add(tid,interval 5 MINUTE) < NOW() "); }
Muligvis det er lidt ressourcekrævende, og i hvert fald noget af det kan gøres mere smidigt, men det burde virke... Så skal det bare inkluderes i toppen af alle dine sider.
Ja, scriptet skal inkluderes på alle sider. Det er ret vigtigt faktisk, fordi du ellers vil opleve at session variable opfører sig meget underligt. Det er en klasse hvor al session håndtering er indkapslet, og det eneste du skal gøre er at skrive
$sessionHandler = new SessionHandler();
Så registrerer den sig selv som session handler, og så mangler du bare at fixe alle de fejl der garanteret kommer fordi klassen er lavet til mit eget system ;)
jaw skal den bare se sådan ud og skulle det så virke :)? <?php include("dbconnect.php"); if(isset($_SESSION['brugernavn']) && !empty($_SESSION['brugernavn'])) {
$q = mysql_query(" SELECT * FROM status WHERE `brugernavn` = '".$_SESSION['brugernavn']."' ");
if(mysql_num_rows($q) == 0) { mysql_query(" INSERT INTO status (tid, brugernavn) VALUES (NOW(),'".$_SESSION['brugernavn']."') "); } else { mysql_query(" UPDATE status SET `tid` = NOW() WHERE `brugernavn` = '".$_SESSION['brugernavn']."' "); }
mysql_query(" DELETE FROM status WHERE date_add(tid,interval 5 MINUTE) < NOW() "); } ?>
jaw kan jeg ikke os lave så den går ind i tabelen users og laver om i en kollone ved brugeren hvis han er logget ind så den skriver online og offline hvis han ikke er for det vil jeg os gerne have lavet hvis det er mugligt ;D
I den fil hvor du vil se om brugeren er online eller offline... Og så er den nok også forkert, for hvis det er en speciel bruger du vil se, så skal du ændre $_SESSION[...] til et andet variabelnavn der indeholder navnet på den bruger du vil se...
ja jeg siger tak men ændrede bare lidt lidt i den så virker det :) sådan ser koden ud nu <?php $q = mysql_query("SELECT * FROM status WHERE brugernavn = '".$_GET['id']."'"); if(mysql_num_rows($q) == 0) { echo "Offline"; } else { echo "Online"; } ?> ændrede det der session tiil $_GET['id']
hvad skal jeg så ændre ".$_GET['id']." til hvis det skal se's på en brugerliste?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.