Příliš velké množství session
- HejTi
- Člen | 23
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
- 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
- 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
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
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.
- David Grudl
- Nette Core | 8218
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áří.
- Dr.Diesel
- Člen | 53
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"
- David Grudl
- Nette Core | 8218
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
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á.
- Bernard Williams
- Člen | 207
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
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
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.