Avatar billede kwudo Nybegynder
21. august 2005 - 16:53 Der er 31 kommentarer og
1 løsning

Session_timeout / Inaktiv?

Hey jeg tænkte på om man ikke kunne lave noget session timeout så session blev destrueret eller hvad man kalder det.. Efter 10 min hvis man ikke er aktiv..

Kan det lade sig gøre. Jeg har prøvet at lave noget session_timeout men man må jo være online så lang tid man har lyst. Men så efter inaktivitet i 10 min skal man blive kicket..

Hvordan laver jeg det?

Det er mere fordi at ens status har jeg lagt i en række i MySQL som hedder status og den er jo online hvis de glemmer at logge ud for i log ud filen ligger der en update kode som opdatere status til offline..

Men ikke alle der husker det :(

Så vil sku være fedt hvis der var nogle der havde link hvor jeg kunne lære det eller nogen her der kunne lære mig det :)
Avatar billede jakobdo Ekspert
21. august 2005 - 17:09 #1
Jeg tror du skal kigge på denne artikel: http://www.udvikleren.dk/article.php?aid=148
Avatar billede kwudo Nybegynder
21. august 2005 - 17:30 #2
får følgene fejl:
Parse error: parse error, unexpected T_STRING in /hsphere/local/home/kwudo/kwudo.dk/admin/chat2/register_onlineusers.php on line 8
Avatar billede kwudo Nybegynder
21. august 2005 - 17:30 #3
i første script
Avatar billede jakobdo Ekspert
21. august 2005 - 17:34 #4
Vis mig lige koden!
Avatar billede kwudo Nybegynder
21. august 2005 - 17:39 #5
k

<?
include("../connect/cfg.php");
// Variabler der skal bruges
// Vi starter med at finde IP adressen for brugeren
// Denne kode er testet på flere sites, og i øvrigt taget fra PHP’s online dokumentation
$IP = $_SERVER['REMOTE_ADDR'];
$FIP = $_SERVER['HTTP_X_FORWARDED_FOR']; //Vi finder IPen hvis brugeren har brugt en ikke-anonym proxy server

Vi checker så om det lykkedes. Gjorde det det erstatter vi den direkte fundne IP med den vi fandt igennem proxy'en
if (($FIP != "") && ($FIP != "unknown")) $IP = $FIP;
$IP = explode(",", $IP);
$IP = $IP[0];

// Vi finder brugerens hostmask, ud fra IP adressen
$hostmask = gethostbyaddr($IP);

// Vi bruger time() til at få et slags timestamp for lige nu
// Det er antallet af sekunder siden 1. januar 1970 (UNIX epoch)
$timenow = time();
// Vi sætter deletetime til 10 minutter før “lige nu” :)
$deletetime = $timenow-(600);
// Vi finder adressen på den nuværende side
$onlineurl = "http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];

// Vi får lige et rigtigt menneskeligt tidspunkt, til at smide i databasen
// Til det bruger vi date, med en parameter der fortæller hvilket format det skal være i
$tidnu = date("H:i:s");

// Selve opdateringen/indsætningen
// Vi låser tabellen. Dette sørger for at vi ikke får inkonsistente data,
// samt giver hurtigere opdaterings forespørgsler
@mysql_query("LOCK TABLES onlineusers WRITE") or exit;

// Vi sletter brugere der ikke har været online de sidste $deletetime
// dvs. 10 minutter (600 sekunder / 60)
$deletequery = mysql_query("delete from onlineusers where lastseen_stamp < '$deletetime'");

// Vi tjekker, ud fra IP adressen, om brugeren allerede er i tabellen
$tjekquery = @mysql_query("select id from onlineusers where IP like '$IP'");
if(mysql_num_rows($tjekquery) == 0) {
    // Brugeren var der ikke, vi indsætter “ham” lige
    $query = mysql_query("insert into onlineusers (ip, lastseen_stamp, url, title, lastseen, hostmask) values
('$IP','$timenow', '$onlineurl','$title','$tidnu','$hostmask')");
} else {
    // Brugeren var der skam allerede, så vi opdaterer “hans” tid data
// samt sideadresse, titel
    $query = mysql_query("update onlineusers set lastseen_stamp='$timenow', url='$onlineurl',
title='$title', lastseen='$tidnu' WHERE IP like '$IP'");
}
// Vi låser tabellen op igen
@mysql_query("UNLOCK TABLES") or exit;
?>


linie 8 er: Vi checker så om det lykkedes. Gjorde det det erstatter vi den direkte fundne IP med den vi fandt igennem proxy'en

og har prøvet at inkludere en config..
Avatar billede jakobdo Ekspert
21. august 2005 - 17:42 #6
Ja, linie 8 er en kommentar! :o)
Husk // foran!
Avatar billede kwudo Nybegynder
21. august 2005 - 18:01 #7
k :)
Avatar billede kwudo Nybegynder
21. august 2005 - 18:03 #8
Hm.. Der kommer bare en hvid side nu.. :S
Avatar billede Slettet bruger
21. august 2005 - 18:19 #9
Den artikel er også fucked. Brug følgende script:

<?php
$tid    = time();
$ip    = $REMOTE_ADDR;
$bruger = $_SESSION['login_navn'];
$url    = "http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];

$result = mysql_query("SELECT * FROM online WHERE ip like '$ip'");
if (mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO online (ip,tid,bruger,url) values ('$ip','$tid','$bruger','$url')");
} else {
    mysql_query("UPDATE online SET tid='$tid', bruger='$bruger' url='$url' WHERE ip like '$ip'");
}
mysql_query("DELETE FROM online where date < NOW() - 400");
?>
Avatar billede Slettet bruger
21. august 2005 - 18:24 #10
Rettelse:

<?php
$tid    = time();
$ip    = $REMOTE_ADDR;
$bruger = $_SESSION['login_navn'];
$url    = "http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];

$result = mysql_query("SELECT * FROM online WHERE ip = '$ip'");
if (mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO online (ip,tid,bruger,url) values ('$ip','$tid','$bruger','$url')");
} else {
    mysql_query("UPDATE online SET tid='$tid', bruger='$bruger', url='$url' WHERE ip = '$ip'");
}
mysql_query("DELETE FROM online where tid < $tid - 400");
?>
Avatar billede kwudo Nybegynder
21. august 2005 - 18:27 #11
Prøver jeg .. :)
Avatar billede jakobdo Ekspert
21. august 2005 - 18:29 #12
Artiklen er ikke fucked!
Artiklen er som sådan god nok, og den forklare også godt nok hvad der sker underrvejs.
At koden så måske godt kan laves bedre, ikke er up2date osv er jo en anden sag.
Avatar billede kwudo Nybegynder
21. august 2005 - 18:30 #13
Skal jeg lave en fil med det og så inkludere det der hvor man skal være aktiv ?
Avatar billede jakobdo Ekspert
21. august 2005 - 18:33 #14
Den kode skal du include på alle sider ja!
Avatar billede kwudo Nybegynder
21. august 2005 - 18:34 #15
okay, og så hente fra den tabel ? Og udskrive de brugernavne der er online ?

Og så bliver de kicket efter hvor lang tid. ?
Avatar billede kwudo Nybegynder
21. august 2005 - 18:42 #16
Har fundet ud af.. :) Må jeg skrive "En særlig tak til gandso fra eksperten.dk som hjalp mig med en onlineliste" under siden Tak til ?
Avatar billede Slettet bruger
21. august 2005 - 18:47 #17
Værsgo' :)
Avatar billede Slettet bruger
21. august 2005 - 18:48 #18
Avatar billede kwudo Nybegynder
21. august 2005 - 19:06 #19
Ja giver os Jakobdo en særlig tak :)
Avatar billede kwudo Nybegynder
21. august 2005 - 19:07 #20
Og forresten gandso det virker super :)
Avatar billede jakobdo Ekspert
21. august 2005 - 19:14 #21
Selv tak du...
Avatar billede kwudo Nybegynder
21. august 2005 - 19:36 #22
Hm.. Man bliver jo ikke logget ud .. Kan man ikke sætte en session_destroy(); ind så når de 400 sekunder eller hvad det er, bliver man "logget" ud :)?
Avatar billede Slettet bruger
21. august 2005 - 19:38 #23
Kan godt være man kan gøre sådan:

<?php
$tid    = time();
$ip    = $REMOTE_ADDR;
$bruger = $_SESSION['login_navn'];
$url    = "http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];

$result = mysql_query("SELECT * FROM online WHERE ip = '$ip'");
if (mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO online (ip,tid,bruger,url) values ('$ip','$tid','$bruger','$url')");
} else {
    mysql_query("UPDATE online SET tid='$tid', bruger='$bruger', url='$url' WHERE ip = '$ip'");
}
mysql_query("DELETE FROM online where tid < $tid - 400");
while($foo = mysql_fetch_object($query)) {
    if ($bruger) {
        session_destroy(); // slet session
    header("Location: index.php");
    }
}
}
?>
Avatar billede Slettet bruger
21. august 2005 - 19:40 #24
Hov. Nej, det tror jeg ikke man kan. Desuden skulle koden have set sådan ud, hvis du kan bruge det til noget:D

Hov.

<?php
$tid    = time();
$ip    = $REMOTE_ADDR;
$bruger = $_SESSION['login_navn'];
$url    = "http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];

$result = mysql_query("SELECT * FROM online WHERE ip = '$ip'");
if (mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO online (ip,tid,bruger,url) values ('$ip','$tid','$bruger','$url')");
} else {
    mysql_query("UPDATE online SET tid='$tid', bruger='$bruger', url='$url' WHERE ip = '$ip'");
}
mysql_query("DELETE FROM online where tid < $tid - 400");
while($foo = mysql_fetch_object($query)) {
    if ($foo[bruger] !== "") {
        session_destroy(); // slet session
        header("Location: index.php");
    }
}
}
?>
Avatar billede jakobdo Ekspert
21. august 2005 - 19:40 #25
gandso, med session_destroy, så logger du jo brugeren ud...
Hvis du skal lave noget auto-logge ud, så må du bruge et javascript, og det kan du ikke være sikker på virker.
Avatar billede Slettet bruger
21. august 2005 - 19:42 #26
Men - hvad skal det også bruges til? Sessions har jo en levetid, og man skal nok blive logget ud på et eller andet tidspunkt.

Scriptet deroppe er udelukkende lavet til en online brugerliste.
Avatar billede kwudo Nybegynder
21. august 2005 - 19:45 #27
Jamen gandso når man ikke er aktiv i de 400 sekunder eller hvad det er .. Er man ikke på listen mere men er stadig online.. :/
Avatar billede kwudo Nybegynder
21. august 2005 - 19:45 #28
Derfor jeg gerne vil ha de bliver logget ud når de ikke er aktive :)
Avatar billede Slettet bruger
21. august 2005 - 20:15 #29
De mister også deres login efter noget tid. Den tid kan rettes.

Prøv noget med:

$_SESSION["brugernavn"] = time() + (60*20); // Levetid = 20 minutter

session_start();
if ($_SESSION["brugernavn"]<time()) {
header("Location: logud.php");
}
Avatar billede Slettet bruger
21. august 2005 - 20:19 #30
Levetiden er på ca. 20 minutter, og kan vidst ikke rettes andet end i din php.ini-fil
Avatar billede kwudo Nybegynder
21. august 2005 - 20:31 #31
Hm.. Hvor lang tid går der så før man bliver logget ud?

Og hvor skal jeg sætte det kode der, bare i bunden af den fil jeg har lavet med det første kode:

<?php
$tid    = time();
$ip    = $REMOTE_ADDR;
$bruger = $_SESSION['login_navn'];
$url    = "http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];

$result = mysql_query("SELECT * FROM online WHERE ip = '$ip'");
if (mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO online (ip,tid,bruger,url) values ('$ip','$tid','$bruger','$url')");
} else {
    mysql_query("UPDATE online SET tid='$tid', bruger='$bruger', url='$url' WHERE ip = '$ip'");
}
mysql_query("DELETE FROM online where tid < $tid - 400");
?><?php
$tid    = time();
$ip    = $REMOTE_ADDR;
$bruger = $_SESSION['login_navn'];
$url    = "http://".$_SERVER[HTTP_HOST].$_SERVER[REQUEST_URI];

$result = mysql_query("SELECT * FROM online WHERE ip = '$ip'");
if (mysql_num_rows($result) == 0) {
    mysql_query("INSERT INTO online (ip,tid,bruger,url) values ('$ip','$tid','$bruger','$url')");
} else {
    mysql_query("UPDATE online SET tid='$tid', bruger='$bruger', url='$url' WHERE ip = '$ip'");
}
mysql_query("DELETE FROM online where tid < $tid - 400");
?>
Avatar billede Slettet bruger
21. august 2005 - 21:05 #32
Jeg tror bare du skal være tilfreds med at de bliver smidt ud af online brugerlisten efter 400 sekunder, og at folks session ryger efter 20 minutter.

Det er svært og gøre det anderledes
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester