[PHP] Automaticke odhlasenie uzivatela pri neaktivite

Webdesign, HTML, CSS, Flash, PHP, ASP, .NET, JavaScript. Kritika www stránek na Smetišti.

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Sleepy 24. 11. 2005 16:59

Cafte, pravdepodobne sa to uz riesilo, ale predsa zatial cisto teoreticky mi to funguje asi takto:

Prihlasim sa, prebehne overovaci script, ak vsetko prebehne v poriadku tak ulozim do db>>>
user_id, session, nick, ip(aj proxy detekujem), timestamp, active=1

Co z toho pouzit a ako aby som zistil ze uzivatel povedzme uz nie je 120sec aktivny(nepouzije refresh, nikde, neklikne alebo ide na stramku tramtalalali.ru) a active prepnem na 0? Aj ked pravdepodobne uneho ulozene session v pc ostanu.


// mbing : Téma přesunuto ● z Programování do Tvorba webových stránek a aplikací.
Sleepy
Junior

Odeslat příspěvekod Chupacabras 24. 11. 2005 17:24

V JSP je to brnkačka, ale to si asi nechcel počuť :)
Chupacabras
Pokročilý
Uživatelský avatar

Odeslat příspěvekod ptimura 24. 11. 2005 17:42

Asi bys to musel udelat tak, ze na kazdou stranku vlozis includem kratky skriptik, ktery a) zapise novy cas pro tuto session, b) zjisti jestli nektere sessions v tabulce nejsou neaktivni dele nez 120sec, a v pripade ze ano, zmenit jim status.
ptimura
Junior

Odeslat příspěvekod M4rv1n 24. 11. 2005 18:20

To udelej tak ze kazda stranka bude pridavat do databaze kdy naposledy byl uzivatel aktivni (to znamena kdy naposledy zobrazil nejakou stranku), a kazda zaroven bude kontrolovat jestli nebyl prekrocen urcity cas, pokud jo, probehne odhlaseni uzivatele. A 120 sekund je strasne malo, ted si vem ze si nekdo bude u tebe na strance cist nejakej clanek dyl jak 2 min tak ho to odhlasi. Dal bych tak 20 minut.
M4rv1n
Kolemjdoucí

Odeslat příspěvekod Sleepy 24. 11. 2005 19:55

ked time poslednej aktivity je menej ako 20 min tak logout, else update time aktualny cas. ? where session prihlasenia? to sa nemeni ?
Sleepy
Junior

Odeslat příspěvekod Sleepy 24. 11. 2005 21:17

dopadlo to nejako takto, len otazka je ci to je bezpecne a spolahlive?
Kód: Vybrat vše
connect_db();

  $seconds = 12;
  $time = Time();

  $tolerance = $time-$seconds;

$select=query("select * from users_kontrola where  active='1' and session='$_SESSION[session_login]' ");

      while($row = vyber_db($select))

           {

              if ($row[timestamp] < $tolerance){

                   query("update users_kontrola set active='0' where session='$_SESSION[session_login]' and id_user='$row[id_user]' ");

                   query("update users set active='0' where id='$row[id_user]' ");

                   $session_login=md5(uniqid(rand()));
                   $username=md5(uniqid(rand()));
                   session_unset();
                   session_destroy();

            }else{

                   query("update users_kontrola set timestamp='$time' where session='$_SESSION[session_login]' and id_user='$row[id_user]' ");


            }
}


close_db();
Sleepy
Junior

Odeslat příspěvekod Sleepy 24. 11. 2005 21:18

samozrejme ze 12 sekund som pouzival na testovanie :)
Sleepy
Junior

Odeslat příspěvekod o@k 24. 11. 2005 21:25

Sam jsem to nikdy nezkousel, ale co takhle uplne obejit MySQL a na session pouzit PHP garbage collector, konkretne pro vas skript nastavit promennou session.gc_maxlifetime napr. takto
Kód: Vybrat vše
ini_set('session.gc_maxlifetime', '1200');
o@k
Junior
Uživatelský avatar

Odeslat příspěvekod Sleepy 24. 11. 2005 21:28

dakujem, aj to je jedna z moznosti, ale aj tak potom by som musel porovnat ci session existuje a ak existuje tak user je online a ak nie tak je offline. Ale nie je tato premnenna globalne zadefinovana na existenciu session? cize prihlasenie, nejaka doba, pocas doby user aktivny a nechcene odhlasenie?
Sleepy
Junior

Odeslat příspěvekod o@k 24. 11. 2005 21:45

Presne jak rikate, pri uspesnem prihlaseni byste musel nastavit neco jako
Kód: Vybrat vše
session_start();

// ...

$_SESSION["user_status"] = "login";
a na kazde dalsi strance testovat
Kód: Vybrat vše
if ($_SESSION["user_status"] != "login")
{
  // napr. navrat na prihlasovaci stranku
  header("Location: login.php");
}
Pokud by navstevnik vice jak 20 min. neprojevoval zadnou aktivitu (neposilal zadna session data), GC by jeho session data starsi nez 20 min. (ulozena na serveru) pri pravidelne udrzbe smazal a uzivatel by pri pristim prechodu na dalsi stranku neprosel testem. Jinak s platnosti promenne session.gc_maxlifetime se to ma podle PHP-manualu takto:

session.gc_maxlifetime integer

session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up.

Note: If different scripts have different values of session.gc_maxlifetime but shares the same place for storing the session data then the script with the minimum value will be cleaning the data. In this case, use this directive together with session.save_path.

Note: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other filesystem where atime tracking is not available. Since PHP 4.2.3 it has used mtime (modified date) instead of atime. So, you won't have problems with filesystems where atime tracking is not available.

Takze resenim je vytvorit si vlastni adresar na ukladani session data a nasledne jej nastavit do promenne session.save_path, aby GC necistil data i ostatnim aplikacim.
Naposledy upravil o@k dne 24. 11. 2005 21:59, celkově upraveno 1
o@k
Junior
Uživatelský avatar

Odeslat příspěvekod Sleepy 24. 11. 2005 21:58

dakujem, skusim aj tuto variantu.
Sleepy
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků