Autor | Zpráva | ||
---|---|---|---|
H13 Profil * |
#1 · Zasláno: 9. 3. 2006, 22:00:46
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 |
#2 · Zasláno: 10. 3. 2006, 05:57:05
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 * |
#3 · Zasláno: 10. 3. 2006, 10:54:14
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 * |
#4 · Zasláno: 10. 3. 2006, 11:14:34
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 |
#5 · Zasláno: 10. 3. 2006, 11:18:55
Jedině nastavit v php.ini expiraci cookies, které se používají pro identifikaci sessions. Jinak si to musíš napsat sám.
|
||
H13 Profil * |
#6 · Zasláno: 10. 3. 2006, 14:27:12
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 * |
#7 · Zasláno: 11. 3. 2006, 16:00:02
Ž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 |
#8 · Zasláno: 11. 3. 2006, 16:19:18
Tom123
Ono to zase tak jednoduché není, protože funkce ini_set je často zakázaná. |
||
Tom123 Profil * |
#9 · Zasláno: 11. 3. 2006, 19:38:14
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 |
#10 · Zasláno: 11. 3. 2006, 19:41:22
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 |
#11 · Zasláno: 12. 3. 2006, 09:30:58
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. |
||
Časová prodleva: 11 dní
|
|||
Ben Profil * |
#12 · Zasláno: 22. 3. 2006, 23:37:02
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 |
#13 · Zasláno: 23. 3. 2006, 11:25:38 · Upravil/a: Honza Hučín
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 * |
#14 · Zasláno: 23. 3. 2006, 12:07:05
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 |
#15 · Zasláno: 23. 3. 2006, 12:40:02 · Upravil/a: Honza Hučín
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 |
#16 · Zasláno: 23. 3. 2006, 12:44:45
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 * |
#17 · Zasláno: 23. 3. 2006, 14:01:48
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?
|
||
Časová prodleva: 18 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0