Pokud jste se setkali s tím, že se session maže, přesto, že jste zvýšili expiraci v config.neon, může za to systém mazání session v PHP.
Garbage collection
PHP obsahuje GC na mazání session. Je zde několik konfiguračních direktiv, které to ovlivňují. Nás zajímají hlavně session.gc_maxlifetime, session.save_path, session.gc_probability a session.gc_divisor. První, jak název napovídá, určuje životnost session. Poslední dvě pak určují pravděpodobnost, že dojde ke spuštění session garbage collection. Pokud bude gc_probability na hodnotě 1 a gc_divisor na hodnotě 100, dojde ke spuštění GC v asi 1 ze 100 requestů. Neboli je zde 1% šance, že dojde ke spuštění GC.
Když dojde ke spuštění GC, začnou se promázávat session soubory v aktuální složce pro ukládání session nastavenou direktivou session.save_path. Jako životnost session se použije aktuální hodnota session.gc_maxlifetime. Nezáleží tedy na tom, na jakou hodnotu byla životnost nastavena v době vytváření. To může být problém zejména v případě, kdy více aplikací sdílí stejnou složku pro ukládání session, ale mají jinou životnost session - v takovém případě bude aplikace, která má nižší životnost, promazávat session druhé aplikace.
Debian, Ubuntu - cron
Trochu jiná situace je na Debian-based systémech (a možná i jiných), zde je defaultně session.gc_probability nastaveno na hodnotu 0 a garbage collection se vůbec nespouští. O promazání session se pak stará cron script. Ten však zcela ignoruje nastavení aplikace a použije session.gc_maxlifetime z php.ini.
Vlastní session.save_path
Pokud má server, kde hostujeme aplikaci, nízkou životnost session a nemůžeme to přímo ovlivnit, můžeme si nastavit jinou cestu pro ukládání session pomocí direktivy session.save_path. Pozor však na to, aby (zejména pokud se čištění stará systémový cron) docházelo k promazávání session. To můžeme vyřešit vlastním cron scriptem, nebo prostým zapnutím GC (tedy například nastavením session.gc_probability na 1).
Jiné session handlery
Session nemusíme ukládat pouze do souboru. Jednou z možností je například key-value databáze Redis. Ta podporuje TTL u jednotlivých záznamů, takže dokonce jednotlivé záznamy mohou mít odlišnou dobu expirace a o jejich úklid se postará sám Redis.
Pokud jste se setkali s tím, že se session maže, přesto, že jste zvýšili expiraci v
config.neon
, může za to systém mazání session v PHP.Garbage collection
PHP obsahuje GC na mazání session. Je zde několik konfiguračních direktiv, které to ovlivňují. Nás zajímají hlavně
session.gc_maxlifetime
,session.save_path
,session.gc_probability
asession.gc_divisor
. První, jak název napovídá, určuje životnost session. Poslední dvě pak určují pravděpodobnost, že dojde ke spuštění session garbage collection. Pokud budegc_probability
na hodnotě 1 agc_divisor
na hodnotě 100, dojde ke spuštění GC v asi 1 ze 100 requestů. Neboli je zde 1% šance, že dojde ke spuštění GC.Když dojde ke spuštění GC, začnou se promázávat session soubory v aktuální složce pro ukládání session nastavenou direktivou
session.save_path
. Jako životnost session se použije aktuální hodnotasession.gc_maxlifetime
. Nezáleží tedy na tom, na jakou hodnotu byla životnost nastavena v době vytváření. To může být problém zejména v případě, kdy více aplikací sdílí stejnou složku pro ukládání session, ale mají jinou životnost session - v takovém případě bude aplikace, která má nižší životnost, promazávat session druhé aplikace.Debian, Ubuntu - cron
Trochu jiná situace je na Debian-based systémech (a možná i jiných), zde je defaultně
session.gc_probability
nastaveno na hodnotu 0 a garbage collection se vůbec nespouští. O promazání session se pak stará cron script. Ten však zcela ignoruje nastavení aplikace a použijesession.gc_maxlifetime
z php.ini.Vlastní
session.save_path
Pokud má server, kde hostujeme aplikaci, nízkou životnost session a nemůžeme to přímo ovlivnit, můžeme si nastavit jinou cestu pro ukládání session pomocí direktivy
session.save_path
. Pozor však na to, aby (zejména pokud se čištění stará systémový cron) docházelo k promazávání session. To můžeme vyřešit vlastním cron scriptem, nebo prostým zapnutím GC (tedy například nastavenímsession.gc_probability
na 1).Jiné session handlery
Session nemusíme ukládat pouze do souboru. Jednou z možností je například key-value databáze Redis. Ta podporuje TTL u jednotlivých záznamů, takže dokonce jednotlivé záznamy mohou mít odlišnou dobu expirace a o jejich úklid se postará sám Redis.