Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kontrola długości trwania sesji
Forum PHP.pl > Forum > PHP
dyke
Wiem, że temat przewijał się na forum już niejednokrotnie, ale za każdym razem poruszany był inny asperkt problemu, a chciałbym zebrać je wszystkie w jednym miejscu, tym bardziej że pomimo licznych godzin nadal nie udało mi się rozwiązać mojego problemu z kontrolą sesji.

Stworzyłem serwis extranetowy dla pracowników pewnej firmy (logowanie oparte na sesji), który posiada m.in. możliwość składania elektroniczych zamówień przez akwizytorów. Ponieważ zamówienia mogą być bardzo rozbudowane, czasem ich wpisywanie zajmuje więcej niż domyślnie ustawione w php.ini 24 minuty (1440s.) Próbowałem manipulować długością sesji, tak aby wydłużyć ją do min. 1h, a oto stosowny kod, który umieszczany jest w nagłówku każdej strony:

[php:1:0d95246863]<?php
$expireTime=60*60; // 60 minut
ini_set('session.gc_maxlifetime', $expireTime);
ini_set('session.gc_probability', 100);

session_start();

/* set the cache limiter to 'private' */
session_cache_limiter('private');
// $cache_limiter = session_cache_limiter();

/* set the cache expire to 60 minutes */
session_cache_expire(60);
// $cache_expire = session_cache_expire();

/* set the cookie expire */
$expireTime = 60*60;
session_set_cookie_params(time()+$expireTime);
?>[/php:1:0d95246863]
Prawdopodobieństwa uruchomienia garbage collectora ustawiłem na 1, gdyż jest stosunkowo niewiele odsłon dziennie. Co dziwne o ile 'session.gc_maxlifetime' i 'session.gc_probability' są właściwie zmieniane (sprawdzam to funkcją phpinfo()), to nie ulegają zmianie ustawienia dotyczące ciasteczek i session_cache_limiter oraz session_cache_expire. Dlaczego?

Niestety powyższy kod nie przynosi zamierzonego efektu. Próbowałem zmianić czasy w powyższym kodzie na 1 min. aby sprawdzić czy ustawienia przynoszą efekt, ale np. po 10 min sesja nadal trwała. Czy istnieje w związku z tym jakiś precyzujne sposób na określenie że sesja kończy się np. dokładnie po 1h?

Chciałbym bowiem umieścić na każdej ze stron Javascript informujący o czasie jaki pozostał do zakończenia sesji - poniżej kod funkcji:
Kod
function toSessionEnd()

{

hours = Math.floor(ses_time/3600);

remaining = ses_time%3600;

minutes = Math.floor(remaining/60);

seconds = remaining%60;



if (hours < 10)

{ hours = "0" + hours; }

if (minutes < 10)

{ minutes = "0" + minutes; }

if (seconds < 10)

{ seconds = "0" + seconds; }

if (ses_time > 0)

{

window.status = "Sesja zostanie zakończona i zostaniesz automatycznie wylogowany za: " + hours + ":" + minutes + ":" + seconds + "";

}

else

{

window.defaultStatus = "Sesja zakończona. Proszę zalogować się ponownie.";

clearTimeout(osHandler);

}

ses_time = ses_time-1

osHandler = setTimeout("toSessionEnd();", 1000);

}


Powoli zaczynam czuć się bezradny, bo spędziłem nad tym tematem już mnóstwo godzin :cry: i nadal sesja rządzi się swoimi prawami. Proszę o pomoc.

Mam jeszcze kilka drobnych pytań:
1. Czym się różnią ustawienia 'session.gc_probability' od 'session.gc_divisor'?
2. Jaka jest różnica pomiędzy 'session.gc_maxlifetime' w php.ini, a funcją session_cache_expire(60)?
3. Co tak naprawdę daje ustawienie session_cache_limiter('private') (przepisałem je żywcem z przykładu na php.net) :oops:
dyke
Uwaga do powyższego posta: kod JavaScript działa poprawnie i umieściłem go jedynie aby zarysować problem z czasem trwania sesji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.