Autor Zpráva
Camo
Profil
Zdravím vás,
prosím vás vie mi niekto vysvetliť, ako by som mohol predĺžiť session z browsera? Aby ma po 20 minútach neodhlásilo. Skúšal som to cez odoslanie ajaxového requestu, ale zdá sa že to nefunguje. Vie niekto ako na to?
blaaablaaa
Profil
Camo:
"ale zdá sa že to nefunguje" ... co to znamena? Proc by nemelo fungovat, v nejakem intervalu posles na server jakykoliv dotaz (a ve skriptu na serveru zavolas session_start()).
Camo
Profil
Je to robené v Nette a ten Ajax vyzerá takto:
setInterval( function()
{
    $.ajax({
        type: 'POST',
        url: {link :Helper:default},
        accepts : 'json',
        complete: function( jqXHR )
        {
            if( jqXHR.status == 200 ) console.log( jqXHR.responseJSON.message );
            else alert( 'Za niekoľko sekúnd budete automaticky odhlásený z dôvodu nečinnosti. Ak sa tomu chcete vyhnúť refrešnite stránku.' );
        }
    });
}, 1000 * 60 * 19 );
Keď ten interval skátim na 10s tak jqXHR.status je 200. Ale keď ten interval predĺžim na tých 100 * 60 * 19 tak ten status nie je 200 a session normálne vyprší a odhlási ma.

Ten Helper presenter vyzerá:
public function renderDefault()
{
    $this->sendJson( ['message' => 'Session was extended'] );
}
blaaablaaa
Profil
A kdyz to budes pingovat treba po 5 minutach?
Camo
Profil
blaaablaaa:
Neviem. Aký je rozdiel medzi 19 a 5?
Phph.ini má session.gc_maxlifetime = 1440 a je tam ešte direktíva session.cache_expire = 180 ktorá zatiaľ neviem čo znamená...


Hmm, keď je ten interval kratší tak to síce vracia status 200, ale po 24 minútach som aj tak odhlásený, takže session sa nepredĺži :(
Davex
Profil
Pokud ti session skončí pokaždé po 24 minutách, tak se data nejspíš mažou nezávislým procesem přímo na serveru. Kdyby to záleželo na PHP, tak tam je ve standardním nastavení 1% pravděpodobnost smazání session. Zkus prodloužit session.gc_maxlifetime (1440 vteřin je 24 minut) a session data ukládat jinam než do výchozího adresáře pomocí session.save_path.
Camo
Profil
Davex:
To s tým mazaním dát som nepochopil. Veď každé volanie session_start() by malo oživiť platnosť session nie? Tak si to predstavujem ja. Samozrejme som sa aj ja dočítal o session garbage collectore a o 1% pravdepodobnosti zmazania, ale nebudem sa tváriť, že tomu rozumiem. Ak mi to vie niekto vysvetliť tak to ma naozaj poteší.
Davex
Profil
Camo:
Veď každé volanie session_start() by malo oživiť platnosť session nie?
Tady je možná důležité vědět, jak probíhá to „oživení“ session. Většinou to znamená pouze aktualizaci času poslední změny souboru se session, pokud je uživatel na webu aktivní. Nevím, jak to probíhá u jiných způsobů ukládání session dat (memcache, redis apod.)

Když se potom bude na serveru spouštět cronem skript, který bude staré session soubory mazat podle času jejich vytvoření, tak se smažou dřív. Na některých Linuxových distribucích bývá obvyklé, že se mažou dvakrát za hodinu, takže ke smazání může dojít někdy mezi 24 až 54 minutami od vytvoření session.
Camo
Profil
V session problém zdá sa nieje. Session premenné normálne fungujú. Myslím si, že pes je zakopaný niekde v Nette autentizácii. Podmienka $this->user->isLoggedIn() vracia false.
Camo
Profil
Tak nakoniec som mal zle nastavenú expiráciu pri logine. Miesto
$user->setExpiration(0, TRUE);
som mal
$user->setExpiration("30 minutes", TRUE);
Zatiaľ sa zdá že to funguje. Nakoniec aj ten Ajax bude asi zbytočný.
Alphard
Profil
Camo:
Nakoniec aj ten Ajax bude asi zbytočný.
Tomu nerozumím. Ajax je tam od toho, aby prodlužoval expiraci, když uživatel nic nedělá, ale má stranku otevřenou na pozadí. Aspoň tak jsem tomu rozuměl a to jediné dává smysl.
Oprava popsaná v [#10] tento úkol nenahradí. (Možné zjednodušení by bylo nepoužívat přímo ajax, stačilo by načíst php stránku přes load obrázku, ale když už to máte...)
Camo
Profil
Alphard:
Životnosť session sa dá nastaviť nie? Ak mám v config.neone nastavenú session na 14 dní, tak neviem ale predpokladám, že Nette to niekde nastavuje cez ini_set('session.gc_maxlifetime', 14 * 24 * 60 * 60); Aj keď je pravda, že som nič podobné v Nette nenašiel. Dnes som to skúšal bez toho ajaxu a fungovalo to. Neviem teda či to bolo preto, že ten garbage collector ešte session nezmazal, alebo že to je správne nastavené. Stále mám z toho bordel v hlave.
Alphard
Profil
Jestli od začátku stačí prodloužit maxlifetime, tak celý ten ajax byl jen (ne moc dobrý) workaround. Potom samozřejmě pryč s ním a relevantní je [#8] Davex. Potom byl ale špatně položený už první dotaz. Otázka měla znít, jak prodloužit trvání session, bez toho dodatku „přes browser“.
Není tady dost informací na detailní posouzení stavu.
Camo
Profil
Alphard:
Pred tým mi to hádzalo ešte inú chybu a nevedel som kde je problém.

Díky všetkým za pozornosť.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0