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);
}
{
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: