Web tvori enormni mnozstvi sessions
- Ja
- Člen | 260
Hello,
resime ted s kolegy takovy zajimavy problem, prebrali jsme jeden projekt, ktery v soucasnosti ma ramcove navstevnost tak 13 000 – 20 000 lidi denne.
Session v Nette je nastavena takto:
session:
autoStart: true
expiration: 365 days
savePath: "%tempDir%/../../session"
Na hostingu je nastaven cronjob, ktery maze soubory sessions, ktere jsou starsi nez 10 dni. I presto ale udajne souboru session tam je 4.5 milionu. Nemame prava do tech session souboru nahlizet, ale muzeme si je aspon nejakym zpusobem vylistovat a vyfiltrovat a prisli jsme na to, ze treba dnes rano v 1:04 se vytvorilo celych 206 souboru sessions.
Nenapadlo by vas prosim nekoho co muze byt pricina, ze web tvori tak enormni mnozstvi session souboru? Pripadne jak v takovem pripade postupovat – tzn. jak zjistit co muze byt pripadne pricinou?
Predem moc diky!
Honza
- David Grudl
- Nette Core | 8218
Funguje ten web tak, že když přijde unikátní návštěva, vytvoří se session?
Pokud se tak děje a zároveň to není nutné, chtělo by to zjistit, proč se tak děje. Tj. vysledovat, jaký callstack vede k tomu, že se zavolá Nette\Http\Session::start().
- Ja
- Člen | 260
@DavidGrudl
Funguje ten web tak, že když přijde unikátní návštěva, vytvoří se session?
Ano funguje
Pokud se tak děje a zároveň to není nutné, chtělo by to zjistit, proč se tak děje. Tj. vysledovat, jaký callstack vede k tomu, že se zavolá Nette\Http\Session::start().
Dekuju za nasmerovani! Zkusime to jako startovni bod :)
- Kamil Valenta
- Člen | 815
Nejsou v logu přístupy nějakých Botů, které ve statistikách návštěvnosti nejsou započítány? Takto mi jednou boti dokonce sestřelili httpd…
- Ja
- Člen | 260
@KamilValenta proverili jsme access logy a asi je to jak rikas, nejvic requestu dela bingbot…
Nemate s tim nekdo zkusenost jak teda pro boty sessions nevytvaret? Jen se obavam, abychom teda neudelali nejake reseni, ktere vytvareni sessions nechtene nezablokuje i nekterym uzivatelum napr. s neobvyklym user agentem…
- Pavel Kravčík
- Člen | 1194
Zrovna teď jsme to řešili. Mrkni, jestli se Ti někde v constructoru třeba nevytváří zbytečně a tím pádem při každém requesty (to by nemělo být potřeba).
- Ja
- Člen | 260
@PavelKravčík te projekt je prebranej a je dost naprasenej (cisty PHP fuzovany s Nette), ale asi nam nic jinyho nezbyde
Mozna by me jeste zajimalo, na projektu je nastaveno session.autostart: true, nepomohla by zmena na „smart“? Nejsem si uplne jistej z popisu docs jak presne smart ma fungovat, ale cekal bych asi ze se session zalozi jen az kdyz je potreba (napr. vhozeni do kosiku, sign in atd…) – ale muzu se mylit
- Pavel Kravčík
- Člen | 1194
@Ja – určitě bych vyzkoušel, ale je jestli je hodně
naprasený – pravděpodobně to bude končit na bufferu, že byl poslaný
output už. My měli problém, že constructoru bylo
$this->Session = $session->getSection()
. Takže jsme
skončili na krásných 480k session za pár dní (většina roboti). Jednu
méně důležitou věc jsme dali raději do cookie a máme místo 480k třeba
10. :)
- David Grudl
- Nette Core | 8218
Tak samozřejmě ‚session.autostart: true‘ nastartuje session při každém požadavku, tím máš po příčině dopátráno.
- MKI-Miro
- Člen | 277
Ahojte
Ked vysiel clanok https://blog.nette.org/…jsi-sessions tak som prerobil kod podla neho.
Teraz som si vsimol ze to zacalo vytvart oborobvske mnozstvo sessions suborov. Session autostart ale nemam.
Dokonca je ich tam tolko ze ani FTP klient mi ich nevylistuje ani ls | wc -l neodpoveda (na hostingu)
A teraz 2 otazky:
1. Ako vyriesit aktualny stav
- vymazanie komplet suborov sposobi ze ludom zmiznu veci z kosika alebo
z oblubenych
– da sa nejako vylistovat len tie ktore „su prazdne“ a zmazat len tie?
(pozeram ze Nette\Http\Session nema nejaku metodu cez ktoru by som vedel
pristupit ku vsetkym ulozenym session)
2. Ako najst kde je preco sa subory vytvaraju?
dakujem
Editoval MKI-Miro (17. 11. 2021 18:38)
- David Grudl
- Nette Core | 8218
Logování v události $onStart by ti mělo pomoci přijít na důvod, proč se vytvářejí.
- Marek Bartoš
- Nette Blogger | 1260
Dřív to bylo lazy. Imho tu chybí podmínka pro vrácení prázdných dat
v případě, že session není aktivní a metoda se volá z getState() nebo
clearAuthentication()
https://github.com/…nStorage.php#L122
Editoval Marek Bartoš (23. 11. 2021 17:21)
- David Grudl
- Nette Core | 8218
To by nemělo. Máš poslední verze nette/http a nette/security, nebo nějaké starší?
- MKI-Miro
- Člen | 277
cize ak by niekto potreboval script na odmezanie suborov – potrebne spustit tolko krat kolko treba :)
if ($h = opendir($dir)) {
$indes = 0;
while (($file = readdir($h)) !== false) {
if ($file != '.' && $file != '..') {
$index++;
echo "The file in $dir is $file with size " . filesize("../temp/sessions/" . $file) . "<br />";
if (filesize("../temp/sessions/" . $file) == 102) {
unlink("../temp/sessions/" . $file);
}
}
if ($index > 50000) {
break;
}
}
closedir($h);
}