Příliš velké množství session

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
HejTi
Člen | 23
+
0
-

Máme na http://www.signaly.cz problém – v bootstrapu jsme si definovali vlastní adresář pro uchovávání session:

<?php
...
$session = Env::getSession();
$session->setSavePath(Env::getVariable('sessionsDir'));
$session->setExpiration(3 * 24 * 3600);
...
?>

Respektive to asi rozdělím na problémy 2

  1. neodmazávají se expirované session – kdybyste s tím měl někdo zkušenost, radu uvítám, ale to si kdyžtak nějak pořeším
  2. generuje se podle mě zbytečně moc session – cca to odpovídá počtu pageviews, což mi při údaji z GA 9,5 stránky/návštěva připadá divné (nicméně díval jsem se a třeba mně cookie drží stále stejné session id) – a to je to s čím si nevíme nikdo z našeho týmu rady. (Na jiných webech na prakticky totožném serveru, které nepoužívají nette problémy nejsou.)

Nemáte někdo nějaký nápad co s tím?

On by to nebyl zas až takový problém, kdyby to nebylo 100 000 nových souborů denně. Když to pár dní nepromáznu, tak začne mít souborový systém významně delší odezvu a po víc jak deseti dnech, když se sejde víc požadavků za ráz, tak to odstřelí celý server…

Editoval HejTi (28. 10. 2010 18:32)

jansfabik
Člen | 193
+
0
-

V PHP je funkce session_set_save_handler, díky které můžeš ručně ukládat sessions třeba do databáze (tam není 100 000 řádků denně zas takový problém). V komentářích se dají najít řešení pro mysql a memcached. Navíc není problém si udělat cron, který ti jednoduchým DELETE dotazem promaže nepotřebné sessions.

Editoval jansfabik (28. 10. 2010 20:30)

HejTi
Člen | 23
+
0
-

Dík, nicméně to není řešení příčiny, ale jen uspořádání či pravidelné uklízení nepořádku.

Potřeboval bych spíš tip, čím by mohl být způsobený ten velký počet session – jsem si jistý, že některé jsou tam vygenerovány zcela zbytečně, ale v týmu si lámem hlavu nad otázkami proč a kde se to děje.

srigi
Nette Blogger | 558
+
0
-

Skus session savepath nastavovat cez config.ini (vid sandbox).

David Grudl
Nette Core | 8218
+
0
-

Je to zvláštní, možná by stálo za to analyzovat, kdo a proč ty sessions vytváří. Zkus si upravit metodu Session::start(), a uložit do $_SESSION['track'] = $_SERVER; a poté analyzovat, kdo a na jakých URL ty sessions vytváří.

jansfabik
Člen | 193
+
0
-

Možná radši něco jako if (mt_rand(0,100) == 0) $_SESSION['track'] = $_SERVER;, jestli to přidává 100 000 souborů denně.

Dr.Diesel
Člen | 53
+
0
-

Ohledne promazavani sessions, o to se stara garbage collector, ktery procistuje tusim jen adresar definovany v php.ini . Smazani expirovanych souboru je mozne pres jeden exec('find ... '); najdes to urco v googlu, treba tady
http://www.howtogeek.com/…ys-on-linux/

Ohledne poctu sessions.

  • Proveril bych nejakeho robota, ktery nedrzi cookies, jestli ti na ten web neleze.
  • Dal bych zkusil treba 1 den logovat do souboru sess-{IP adresa}.log jednotlive vytvarene sessions (tj. pokud nedostanes cookie) vcetne casu, user agenta a nejakou serializaci cookies cos dostal +omrkni jestli nektere IP nemaji ten log zasadne velky
  • Pokud je souboru hodne a je potreba je drzet, zkus jeste pouzit adresarovou strukturu podle pocatecnich znaku, viz php.ini:
; Argument passed to save_handler.  In the case of files, this is the path
; where data files are stored. Note: Windows users have to change this
; variable in order to use PHP's session functions.
;
; The path can be defined as:
;
;     session.save_path = "N;/path"
;
; where N is an integer.  Instead of storing all the session files in
; /path, what this will do is use subdirectories N-levels deep, and
; store the session data in those directories.  This is useful if you
; or your OS have problems with lots of files in one directory, and is
; a more efficient layout for servers that handle lots of sessions.
;
; NOTE 1: PHP will not create this directory structure automatically.
;         You can use the script in the ext/session dir for that purpose.
; NOTE 2: See the section on garbage collection below if you choose to
;         use subdirectories for session storage
;
; The file storage module creates files using mode 600 by default.
; You can change that by using
;
;     session.save_path = "N;MODE;/path"
;
; where MODE is the octal representation of the mode. Note that this
; does not overwrite the process's umask.
; http://php.net/session.save-path
;session.save_path = "/tmp"
iguana007
Člen | 970
+
0
-

Dr.Diesel napsal(a):

…u je mozne pres jeden `exec('find … ');…

K tomu by se přeci dal použít i Finder z Nette…

HejTi
Člen | 23
+
0
-

Tak jsme se konečně dostali k analýze a zjistili, že nám to skutečně tvoří roboti, kteří si nedrží session. Což se mi zdá divné, protože sem si myslel, že třeba googlebot běžně session drží… Hmm. Máte nějaký nápad co s tím?

David Grudl
Nette Core | 8218
+
0
-

Myslím, že žádný robot nedrží cookies a tudíž ani sessions. Řešením je nestartovat sessions vždy, případně podle user agenta.

Patrik Votoček
Člen | 2221
+
0
-

David Grudl napsal(a):

…Řešením je nestartovat sessions vždy, případně podle user agenta.

Narážím poslední dobou na podobný problém. Nestartování sessions vždy tak trochu nejde. A to kvůli Nette\Forms\Form::addProtection(...) protože formuláře tvořím skrze továrničky a tak část stránky může být vykreslená dřív než se zavolá továrnička a pak nastane problém kvůli již odeslaným hlavičkám. Jediné řešení, které mě napadlo je startovat sessions vždy. Protože nevím jak detekovat že se bude volat ona továrnička dřív než se doopravdy zavolá.

jansfabik
Člen | 193
+
0
-

A nešlo by detekovat robota až na konci skriptu a tu session smazat?

norbe
Backer | 405
+
0
-

Nebo při detekci robota nastavit sessions na něco jako DummySessions

Filip Procházka
Moderator | 4668
+
0
-

norbe has the point :) +1

Patrik Votoček
Člen | 2221
+
0
-

a nebo ještě lépe mazat „prázdné“ sessions…

Honza Kuchař
Člen | 1662
+
0
-

…na konci requestu…

David Grudl
Nette Core | 8218
+
0
-

Přes $session->destroy()

HejTi
Člen | 23
+
0
-

Díky všem, nakonec jsme

  1. vyřešili tak, že máme svůj cron, který maže session starší 3dnů v našem session úložišti
  2. jak radil jansfabik – na konci scriptu bota detekujeme a přes session->destroy dané session rovnou smažeme

Editoval HejTi (13. 1. 2011 11:52)

Bernard Williams
Člen | 207
+
0
-

Nazdárek,

narazil jsem na stejný problém. Množství sessions se pohybuje v řádech 100 tis. a tento počet je jen o cca 1% vyšší, než celkový počet zobrazených stránek. Není tedy chyba v tom, že se sessions generují při každém zobrazení stránky?

HejTi: Mohl by ses s námi podělit o své konkrétně řešení. Ulehčilo by mi/nám to práci.

Děkuji
Bernard

Bernard Williams
Člen | 207
+
0
-

Stará se nějak Nette o staré sessions nebo je potřeba je promazávat ručně/vlastním scriptem?

Co jsem se díval do složky se sessions, tak se tam neustále hromadí, i když už ne tolik, protože filtruji cca 15 robotů a u nich sessions vůbec nevytvářím.

Jak spravujete sessions vy?

JakubJarabica
Gold Partner | 184
+
0
-

Máme ich uložené v memcached. Ten má svoje algoritmy na čistenie najstarších položiek ak je plný, takže to neriešim. Keď si nájdem viac času, chcem si to odsledovat či a prípadne ako sa to čistí zo strany PHP.