Autor Zpráva
H13
Profil *
Ahoj,

potřeboval bych vědět, jak jednoduše nastavit sezení na určitý čas, to znamená př.:

Uživatel se přihlásí a začne sezení.
Sezení se ukončí, když se uživatel odhlásí a nebo když uplyne nějaký čas, např. za 5 minut.

Zajímalo by mě tedy, jak jednoduše nastavit ukončení session za 5 minut

a) od přihlášení
b) od nečinnosti uživatele

Díky moc

Honza
Hugo
Profil
H13

Možností je několik. Pokud máš přístup ke konfiguraci php, tak se stačí pohrabat v php.ini.

Jinak musíš ukládat do sessions čas poslední akce (příp. přihlášení) a porovnávat ho s aktuálním časem. Příp. si můžeš napsat vlastní funkci na ošetření sessions a tam to řešit po svém.
peta
Profil *
H13 nejjsednodussi je pres session, viz Hugo. Session se samo obnovuje pri odesilani a kdyz neni aktivita, v php.ini je nastaveno neco kolem 24 minut po jejich uplynuti se smaze samo. Takze neni, co resit.

Samozrejme muzes pouzit jiny zpusob, zaznamenavat cas do souboru/sql a kontrolovat kazdou minutu vvsechny uzivatele v online tabulce.

prace se session vypada tak, ze:
prvni radek v kazdem souboru
<? session_start(); ?>

login
udelas si logovaci script, najdes udaje o uzivateli a zapises do session, co potrebujes:
$_SESSION['login' ] = $login;
$_SESSION['psw' ] = $psw;
pak kontrolujes, jestli je login nastaven if (isset($_SESSION['login']))...
(tj pod prvni radek se start pridas radek $logged=(isset($_SESSION['login'])?1:0 a pak kontrolujes if ($logged==1) nebo mozna i if ($logged))

odlogovani
unset($_SESSION['login'])
H13
Profil *
tyhle podminky celkem zvladam, ale jak jednoduse nastavit, ze session uz nebude aktivni napr. za pet minut. Zajima me, jestli proto neexistuje nejaky prikaz nebo jestli musim vytvorit nejakou funkci v php

php:

zacatek session - zjisteni casu - nastaveni konecneho casu (napr. za pet minut se ukonci session)
kontrola, zda jiz neni prekrocen cas - jestli ano - ukonceni session, jestli ne - pokracovani
Hugo
Profil
Jedině nastavit v php.ini expiraci cookies, které se používají pro identifikaci sessions. Jinak si to musíš napsat sám.
H13
Profil *
No nejsem programátor, ale viděl bych to nějak takto(ale nevím jestli to nejde udělat lépe):

$cas = strtotime("now"); ...zjištění současného času
$_SESSION["cas"] =$cas; ... vložení času do session


$cas = $_SESSION["cas"]; ... při nějaké akci využiti času začátku uloženého do session
$koneccas = $cas + 50; ... nastavení konce session
$casnyni = strtotime("now"); ...zjištění nynějšího času

if ($casnyni > $koneccas) ... když je nynější čas (čas v průběhu skriptu) větší než námi udaný konec vypršení session

{
unset($_SESSION['nejaka session']);
}
Tom123
Profil *
Životnost sessions můžeš jednosuše kontrolovat přez nastavení session.cookie_lifetime, ale pouze pokud používáš k uložení sid cookies.

Např:
ini_set('session.cookie_lifetime',$cas);

$cas je počet sekund.

http://mirrors.inway.cz/manual/cs/ref.session.php
Hugo
Profil
Tom123

Ono to zase tak jednoduché není, protože funkce ini_set je často zakázaná.
Tom123
Profil *
Tak použijeme session_set_cookie_params, tady by už neměl být problém :o)

http://mirrors.inway.cz/manual/cs/function.session-set-cookie-params.p hp
Leo
Profil
Nikdy jsem u session nepouzival jine cookies nez docasne (zrusi se pri zavreni prohlizece), a rekl bych, ze vychozi nastaveni nekterych prohlizecu (IE) cookies s nastavenou platnosti neprijme. Leo
pmasarik
Profil
Odporúčam pozrieť aj na funkcie:
session_cache_expire($expiretime);
session_cache_limiter('private');

Bez ich pomoci som nedokázal nastaviť aby sa session nezmazala na servery po určitom čase.
Cookies sa nastavuje pomocou session_set_cookie_params.
Ben
Profil *
Zdravim. Mam podobny a prece trosku jiny problem.
Staram se o stranky umistene na levnejsim hostingovem servru, kde nemam pristup k php.ini a je tam zapnuty SAFE MODE, takze ini.set() nepripada v uvahu.

Problem: prihlasovani registrovanych uzivatelu resim overovanim hesla z DB a pokud sedi, tak nastartuju session. Asi po 24 minutach neaktivity (pry default hodnota php.ini) pravdepodobne garbage collector na servru smazne session_cookie a uzivatel se pak musi hlasit znovu. Ja bych nejak potreboval tuhle dobu natahnout treba na 2 dny. Omezit zivotnost session na dobu kratsi nez tech 24 minut dokazu, ale natahnout se mi to zatim nepodarilo.
Poradite nekdo jak na to?

Nekde jsem nasel navod, ze si ukladat session_cookies do jineho nez default adresare a nasadit tam vlastni garbage collector. Ale tohle reseni vyzaduje hned 2 funkce, ktere SAFE MODE nepovoli.

Mozna by mi pomohly ty 2 funkce, o kterych psal pmasarik, ale z tech nejsem moc chytry ... jaksi jsem z description nepochopil, k cemu to presne slouzi. Nebyl by nejaky priklad?
Honza Hučín
Profil
Ben

Jestli tomu dobře rozumím, řešíš situaci, kdy po uplynutí určité doby (24 minut) při přechodu na novou stránku sice klient pošle sessionovou cookie (tj. cookie stále platí), ale na serveru už byla session mezitím smazána garbage collectorem.

Řešil jsem podobný problém. Jedno možné řešení je nastavit garbage collector na delší čas příkazem ini_set('session.gc_maxlifetime', hodnota). Případně přímo přepsat php.ini.
Píšeš, že to nefunguje. IMHO safe_mode je něco jiného než zakázané ini_set, takže bych to přece jenom zkusil. Ale dejme tomu, že to fakt nejde.

Alternativní řešení je při spuštění session si tuto uložit do tabulky databáze a ukládat si tam si všechny změny session proměnných (a samozřejmě session_id a čas poslední návštěvy). Pak mohou nastat tyto možnosti:

1. Uživatel nemá záznam v tabulce (nemá žádné session_id nebo při automatické inicializaci dostal nové id). To znamená, že přišel jako nový. Do tabulky mu uložíme údaje o nově inicializované session.

2. Uživatel přišel se session_id, které je v tabulce známé a u něhož od poslední návštěvy uplynul méně než námi stanovený čas (tj. třeba 2 dny). Tyto informace (session_id a poslední návštěva) máme v tabulce, takže to zjistíme nezávisle na tom, co provedl garbage collector. A teď:

2a. Session stále na serveru existuje (zjistíme existenci nějaké sessionové proměnné). Pak je vše OK a můžeme pokračovat.

2b. Session už byla smazána. Pak zahájíme novou session, nastrkáme do jejích proměnných údaje z tabulky a v tabulce si opravíme session_id na id nové session. A můžeme jet dál, aniž uživatel cokoliv pozná (akorát se změnilo session_id, ale vše ostatní zůstalo).

3. Uživatel přišel se session_id, které je v tabulce známé, ale od poslední návštěvy uplynulo víc než stanovený čas. Pak session jednoduše zrušíme, vymažeme záznam v tabulce, uživateli pošleme zprávu o automatickém odpojení a přesměrujeme ho na přihlašovací stránku (nebo tak nějak, to už závisí na konkrétní situaci).

Vyzkoušeno u PIPNI.CZ.
Ben
Profil *
Díky moc Honzo,

něco takového jsem potřeboval. Ty stránky mám taky na PIPNI.CZ :) a opravdu tam ini_set nefunguje.

Takže v podstatě musím jenom přidat do tabulky uživatelů sloupce "Ssid" a treba "LastVisit" a pak zrealizovat to, co jsi popsal nahore?

No, snad se s tím nějak poperu. Jestli to opravdu funguje na PIPNI, tak to musí vyjít.

Ještě jendou dík.
Honza Hučín
Profil
Tady je struktura tabulky MySQL, kterou používám:

CREATE TABLE sessions (
uid bigint(20) unsigned NOT NULL auto_increment,
sid varchar(200) NOT NULL default '',
ip varchar(15) NOT NULL default '',
browser varchar(200) NOT NULL default '',
rid bigint(20) unsigned NOT NULL default '0',
naposled datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (uid)
)

"sid" je session_id
"ip", "browser" jsou IP a user_agent klienta (kvůli session-stealing)
"rid" je id přihlášeného uživatele (jejich seznam mám v samostatné tabulce, toto id také ukládám do $_SESSION['rid'])
"naposled" je čas poslední návštěvy

Je lepší mít samostatnou tabulku pro session, ne dohromady s tabulkou uživatelů. Propojení může obstarat jeden identifikátor (u mě "rid").
Tomik
Profil
Nevím zda to tady padlo:

Pokud používáš pouze ukládání SESSIONS do COOKIES, tak po uložení všech SESSIONS:

$trvanlivost = 300; // 5 minut
setcookie(ini_get('session.name'),session_id(),time()+$trvanlivost,'/' );
Ben
Profil *
Tomiku, chápu to správně, že cookies prostě využiju pro ukládání session proměnných? Takže postup bude ten samý jako navhroval Honza jenom s tím rozdílem, že údaje sessions nebudu ukládat do DB, ale do cookies?
Toto téma je uzamčeno. Odpověď nelze zaslat.