Jak funguje setExpiration?

před 6 dny

bicekz
Člen | 15
+
0
-

Zdravím,

v presenteru jsem chtěl přidat checkbox pro zapamatování si uživatele při logování. Při následném zpracování ho zpracuji takto:

<?php
if($values->zapamatovat)
    {$this->user->setExpiration('14 days',FALSE);}
else
    {$this->user->setExpiration('30 minutes',TRUE);}
?>

Podle kontrolních výpisů se dostanu tam, kam mám. 30 minutová doba by mohla být ok, ale 14 denní vyprší max za pár hodin. Nehledě na to, že jsem v místním článku vůbec nezjistil, co udává druhý parametr. Našel jsem to takto u někoho na fórum, tak jsem to vložil podle něj.

Co tam mám špatně?
Díky.

před 6 dny

David Matějka
Moderator | 5841
+
0
-

ta expirace přihlášení je ještě omezená expirací session. pokud je tedy expirace session (určená parametrem session.gc_maxlifetime) nižší než 14 dní, tak i přihlášení vyprší dříve.

druhý parametr můžeš smazat, používal se pro to, jestli se má uživatel odhlásit po zavření browseru. vzhledem k tomu, že browsery významně změnily, jak se to chová, tak to postrádalo smysl a ten parametr byl odebrán.

před 6 dny

bicekz
Člen | 15
+
0
-

Díky. Kde tu expiraci najdu, abych ji změnil?

před 6 dny

iguana007
Člen | 990
+
0
-

bicekz napsal(a):

Díky. Kde tu expiraci najdu, abych ji změnil?

v php.ini

před 6 dny

bicekz
Člen | 15
+
0
-

To najdu kde? Nic takového mi vyhledávání nenašlo.
Tím pádem … můžu to vůbec změnit, když jsem na sdíleném hostingu?

před 6 dny

iguana007
Člen | 990
+
0
-

bicekz napsal(a):

To najdu kde? Nic takového mi vyhledávání nenašlo.
Tím pádem … můžu to vůbec změnit, když jsem na sdíleném hostingu?

Si na sdilenem hostingu, tak si napis na support, tam by ti to meli byt schopni nastavit, kdyz ty k tomu pristup nemas ;-)

před 6 dny

bicekz
Člen | 15
+
0
-

Super, skvělé. Díky moc! :)

před 6 dny

duke
Člen | 643
+
+1
-

Session můžeš zpravidla nastavit i přes Nette. Mělo by stačit přidat do configu:

session:
    expiration: 14 days
    save_path: %tempDir%/session

Tu save_path je důležité tam mít v případě, že na stejném serveru běží více aplikací, neboť jiná aplikace si může nastavit kratší expiraci a pak to bude promazávat ten adresář častěji, čímž to ovlivní i ty ostatní aplikace.

před 6 dny

MajklNajt
Člen | 165
+
0
-

@duke nemyslím, že Nette rieši samotné vymazávanie súborov…

před 6 dny

bicekz
Člen | 15
+
0
-

Tak jsem zjistil, že už expiraci jsem tam nastavenou měl, nicméně bez efektu. Druhý příkaz mi hází chybu… Nemůže najít cestu a hází mě to kamsi doprčič do app/…/session

před 4 dny

duke
Člen | 643
+
0
-

@MajklNajt Pokud vím, PHP provádí garbage collection (promazávání starých souborů) při inicializaci session automaticky s určitou pravděpodobností, která se dá nastavit (viz session.gc_probability).

@bicekz Ten adresář session v (v daném případě: app/../temp/session, ale můžeš si tam nastavit klidně i jiné umístění) musíš ručně vytvořit a nastavit mu práva pro zápis uživateli, pod kterým jede php.

před 4 dny

MajklNajt
Člen | 165
+
0
-

@duke áno, ale nepozerá pri tom na konfiguráciu Nette, čiže ak máš na 1 serveri viac Nette aplikácií, v jednej nastavíš exspiráciu 14 dní a v druhej 30 dní, garbage collector pozerá na expiráciu nastavenú v php.ini, a (by default) nepozerá do individuálne nastavených priečinkov pre ukladanie sessions.

EDIT: teda takto to funguje na mojich serveroch s Debianom 9

Editoval MajklNajt (14. 4. 19:41)

před 3 dny

duke
Člen | 643
+
0
-

@MajklNajt Debian je v tomto specifický. Na debianu je ve výchozím nastavení PHP funkcionalita pravděpodobnostního spouštění garbage collectoru po každé inicializaci session vypnutá a o promazávání session se stará speciální skript spouštěný cronem. A ano, zdá se, že tento skript bere v potaz jen adresář nastavený v php.ini, jak říkáš.

Něco víc k tomu (v angličtině) zde.