Autor Zpráva
JanS01
Profil
Dobrý den,
mám nastaveno automatické odhlášení uživatele po nějakém čase, tento čas nastavím při přihlášení (tedkon 2 hodiny), pokud se přihlásím vše se uloží a nastaví jak mám, ale pokud stránku nerefreshnu po uplynutí cca 30minut(refreshnu ji později, jsem odhlášen automaticky což nechci), pokud stránku refreshnu nebo na ní pracuji (klikání na záložky odkazy atd) alespon každou pul hodinku odhlásí mne systém automaticky po 2 hodinách jak mám nastaveno

Uložení času pro odhlášení třída Login.php výňatek
 
// nastavení času pro automatické odhlášení uživatele
$logout_time = time() + (2 * 60 * 60); // aktuální čas +2 hodin
$update2 = "UPDATE `uzivatele` SET `logoutTime` = '$logout_time' WHERE `username` = '$username_form'";
index.php
$login = new Login();

// ... pokud je uživatel přihlášený
if ($login->isUserLoggedIn() == true) {   
    // automaticné odhlášení
    if ($login->getLogoutTime() < time()) { ->getLogoutTime() vrací čas pro odhlášení
        $login->doTimeLeftLogout(); -> smaže session atd a přes header location přesměruje znovu na index
    } else {
        $nadpis = NAZEV_PROJEKTU . " | Admin";
        include("admin/logged_in.php");
    }
    // uživatel je přihlášen  
} else {
    // uživatel není přihlášen 
    $nadpis = NAZEV_PROJEKTU . " | Login";
    include("pages/not_logged_in.php");
}
své stránky zkouším na lokálním serveru, tedy na mém pc: Ubuntu 12, Apache2, vše zkoušeno na localhost v prohlížeči Verze 25.0.1364.160 Ubuntu 12.04 (25.0.1364.160-0ubuntu0.12.04.1)

při loginu si ukládám některá data do $_SESSION(všechny session vznikají při přihlášení ve stejný čas) -> což považuji za důvod, proč se mi odhlašuje automaticky již po 30 minutách nečinosti, ovšem háček je v tom že časy nesedí
php.ini
session.gc_maxlifetime = 1440 -> odpovídá 24minut default nastavení || v php jsem si přes ini_set nastavil dobu dvou hodin což je hodnota 7200, ale se stejně nežádoucím účinkem
session.cache_limiter = nocache
session.cache_expire = 180 -> 3hodiny

Všech rad si velice cením, prohladal jsem zde důkladně forum, progooglil google ale nic co jsem našel mi nepomohlo
DJ Miky
Profil
Nastavení session.gc_maxlifetime přes ini_set() nebude fungovat, protože odstraňování session na Ubuntu, Debianu a možná i někde jinde provádí samostatný cron skript, který se vždy řídí hodnotou v php.ini. Pomůže tedy pouze změna v centrálním php.ini, nelze to nijak ovlivnit ve skriptech (ini_set) ani v .htaccess (php_value).
JanS01
Profil
moc děkuji za odpověď, tuto informaci jsem nevěděl a ani jsem ji nikde nenašel, gc_maxlifetime jsem nastavoval jak v samotném php souboru tak i v .htaccess a hodnotu jsem si vypisoval přes phpinfo() i přes echo proto jsem předpokládal že je to nastaveno dobře, ovšem i kdyby nebylo je defaul nastavena na 24 minut a já jsem si změřil že se mi automatické odhlášení provede až po 30-ti minutách, ovšem je možné nějaká odchylka zpoždění nbo to zapříčiní samotný cron, proto gc_maxlifetime nastavím přímo v php.ini a dám vědět
DJ Miky
Profil
Cron na odstranění se alespoň na Debianu spouští jednou za třicet minut (v základu v :09 a :39 každé hodiny), na Ubuntu to asi bude podobné. Při hodnotě gc_maxlifetime 24 minut se tedy může session odstranit za 24 až 53 minut po jejím vytvoření.
JanS01
Profil
Tak jsem to právě odzkoušel a měl jste pravdu, hodnotu jsem musel změnit přímo v php.ini, restartovat apache a všechno běží jak má, bohužel pro mě jsem zjistil, že měnit gc_maxlifetime přes htaccess nepo ini_set() mají asi všechny webhostingy zakázáno, maximálně mi to některé přenastaví po zaslání žádosti emailem.

Další věc co jsem se chtěl zeptat je jak po přihlášení přes formulář zamezit znovunačtení hodnot, které si předávám přes $_POST, celkem dost jsem si toho přečetl ale jako jediný způsob co jsem našel je přesměrování přes header location, ovšem to já použít nemohu, proto by mě zajímalo jestli jde pouze refreshnout po přihlášení automaticky stránku a tím POST data smazat
DJ Miky
Profil
Na sdíleném webhostingu to bude vždycky problém, pokud používají Debian/Ubuntu nebo provozují PHP jako modul do webserveru (Apache). Každá hostovaná doména by totiž musela mít vlastní adresář pro sessions a vlastní php.ini, podle kterého pak bude prováděno čištění sessions klasickým způsobem (při každém spuštění s pravděpodobností session.gc_probability / session.gc_divisor). Změna přes .htaccess nebo ini_set() by nefungovala, i kdyby byla povolená, z výše uvedených důvodů.

Vlastní adresář pro sessions by šel asi zajistit i na sdíleném hostingu pomocí session.save_path (a poté nastavením session.gc_maxlifetime/gc_probability/gc_divisor). Pokud to hosting neumožní, pak je řešením buď změna hostingu nebo přechod na VPS, kde je možnost libovolně si upravovat nastavení.


Ohledně přesměrování, u POST formulářů se to běžně dělá pomocí přesměrování s HTTP kódem 303 (See Other):
header('Location: ...', true, 303);
exit;
Nevím, proč nemůžeš použít header, ale refresh provedeš pomocí přeměrování na stejnou adresu.
JanS01
Profil
Díky moc za cenné rady, vyzkouším a uvidím, ta expirace session mě zastak netrápí dá se to udělat i jináš ale dobu loginu jsem chtěl delší pro platnost session

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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