contributte / planette-site

💀 [DISCONTINUED] All the roads go through the Planette
https://planette.vercel.app
MIT License
9 stars 3 forks source link

2016-03-02: mazani-expirovanych-session #142

Closed paveljanda closed 7 years ago

paveljanda commented 7 years ago

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.

paveljanda commented 7 years ago

author: David Matějka (matej21@matej21.cz)

meridius commented 7 years ago

I'll take this