Jak funguje setExpiration?

bicekz
Člen | 20
+
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.

David Matějka
Moderator | 6445
+
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.

bicekz
Člen | 20
+
0
-

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

iguana007
Člen | 970
+
0
-

bicekz napsal(a):

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

v php.ini

bicekz
Člen | 20
+
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?

iguana007
Člen | 970
+
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 ;-)

bicekz
Člen | 20
+
0
-

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

duke
Člen | 650
+
+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.

MajklNajt
Člen | 470
+
0
-

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

bicekz
Člen | 20
+
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

duke
Člen | 650
+
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.

MajklNajt
Člen | 470
+
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. 2019 19:41)

duke
Člen | 650
+
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.

MKI-Miro
Člen | 261
+
0
-

Ahojte

prešiel som viacero vlákien ale nenšail som odpoveď v čom by mohol byť problém u mňa:

Prihlásenie mi vyprší za pár hodín napriek tomu že mám nastavené 14 days

config.neon

session:
	expiration: 14 days
	save_path: "%tempDir%/sessions"
	save_handler: files

signInForm

$this->user->setExpiration($values->remember ? '14 days' : '20 minutes');

php settings na websupport.sk

Session Support	enabled
Registered save handlers	files user memcache
Registered serializer handlers	php_serialize php php_binary
Directive	Local Value	Master Value
session.auto_start	Off	Off
session.cache_expire	180	180
session.cache_limiter	nocache	nocache
session.cookie_domain	no value	no value
session.cookie_httponly	0	0
session.cookie_lifetime	0	0
session.cookie_path	/	/
session.cookie_samesite	no value	no value
session.cookie_secure	0	0
session.gc_divisor	10000	10000
session.gc_maxlifetime	21600	21600
session.gc_probability	1	1
session.lazy_write	On	On
session.name	PHPSESSID	PHPSESSID
session.referer_check	no value	no value
session.save_handler	memcache	memcache
session.save_path	/apachetmp/sessions	/apachetmp/sessions
session.serialize_handler	php	php
session.sid_bits_per_character	4	4
session.sid_length	32	32
session.upload_progress.cleanup	On	On
session.upload_progress.enabled	On	On
session.upload_progress.freq	1%	1%
session.upload_progress.min_freq	1	1
session.upload_progress.name	PHP_SESSION_UPLOAD_PROGRESS	PHP_SESSION_UPLOAD_PROGRESS
session.upload_progress.prefix	upload_progress_	upload_progress_
session.use_cookies	1	1
session.use_only_cookies	1	1
session.use_strict_mode	0	0
session.use_trans_sid	0	0

mam nastavené niečo zle?

Ďakujem

MajklNajt
Člen | 470
+
0
-

odpoveď máš hneď na začiatku v reakcii Davida: 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.

MKI-Miro
Člen | 261
+
0
-

a teda cesta ako dosihnut 14 days nie je ziadna? (websupport zdielany hosting)

MajklNajt
Člen | 470
+
0
-

MKI-Miro napsal(a):

a teda cesta ako dosihnut 14 days nie je ziadna? (websupport zdielany hosting)

veď keď to máš nastavené na 6 hodín session.gc_maxlifetime 21600 21600, tak ako chceš z toho spraviť 14 dní? obráť na na ws, nech ti to upravia resp. niektoré direktívy PHP sa dajú nastaviť aj cez administráciu, ale či aj toto, to netuším