Jak funguje setExpiration?
- bicekz
- Člen | 20
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
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.
- duke
- Člen | 650
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.
- duke
- Člen | 650
@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 | 502
@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
@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 | 279
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 | 502
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