Web tvori enormni mnozstvi sessions

Ja
Člen | 260
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

@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
+
0
-

@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
+
+1
-

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
+
0
-

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
+
0
-

Logování v události $onStart by ti mělo pomoci přijít na důvod, proč se vytvářejí.

MKI-Miro
Člen | 277
+
0
-

Skusil som to inak v Basepresentery

public function startup(): void
    {
        parent::startup();
Debugger::dump($this->session->isStarted());
        exit();

session subor sa vytvori

Editoval MKI-Miro (23. 11. 2021 12:20)

MKI-Miro
Člen | 277
+
0
-

Čo sa mi podarilo zatiaľ zistiť:

Lokálne mi to session súbor vytváralo kvôli zapnutej tracy.

Reálne to session súbor vytvorí vo chvíly keď sa v BasePresenteri zavolá

$user->isLoggedIn() && $user->isInRole

@DavidGrudl je to nutne aby sa to takto spravalo?

dakujem

Marek Bartoš
Nette Blogger | 1260
+
0
-

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
+
0
-

To by nemělo. Máš poslední verze nette/http a nette/security, nebo nějaké starší?

Polki
Člen | 553
+
0
-

@DavidGrudl má nejnovější zkoušel jsem to teď lokálně taky a tu sessionu to tvoří.
uvnitř je toto:

__NF|a:3:{s:4:"Time";i:1637684673;s:4:"DATA";a:1:{s:23:"Nette.Http.UserStorage/";N;}s:4:"META";a:0:{}}

nette/http 3.1.3
nette/security 3.1.5

Editoval Polki (23. 11. 2021 17:28)

David Grudl
Nette Core | 8218
+
0
-

Hmmm, pokusil jsem se to fixnout v nette/http 3.1-dev

MKI-Miro
Člen | 277
+
0
-

vyzera ze to funuje, takze moze sa asi aj vypubliovat nova verzia

este otazka: ako nalozit s tymi cca 4 milionmi subormi ktore sa medzicasom vytvorili ? :)

chemix
Nette Core | 1310
+
+2
-

@MKI-Miro smazat vse co je mensi nez „__NF|a:3:{s:4:"Time“;i:1637684673;s:4:„DATA“;a:1:{s:23:„Nette.Http.UserStorage/“;N;}s:4:„META“;a:0:{}}"

MKI-Miro
Člen | 277
+
0
-

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);
}
Michalek
Člen | 211
+
+3
-
$index = 0; // was $indes :)
MKI-Miro
Člen | 277
+
0
-

inac nezasluzi si oprava toho bugu aj novu verziu ? aby sme nemuseli mat v composeri dev vetvu