webForumDet fria alternativet

Problem med konfigurering av session.gc_maxlifetime

18 svar · 663 visningar · startad av lillebror

lillebrorMedlem sedan apr. 20041 597 inlägg
#1

Hej,

Flera besökare på min sida (https://www.flygfyren.nu) har sagt att de blivit utloggade under tiden de har skrivit (längre) inlägg som dragit ut på tiden.

I nuläget initierar jag följande variabel:

(ini_set("session.gc_maxlifetime", "3600"); 
session_start();

Denna kod finns högst upp i min header.php-fil och är inkluderad på samtliga sidor. Varför blir det time-out på sessionen? Under förutsättning att användaren inte överskridit en timme (nuvarande sessionslängd) så förstår jag inte varför han blir utloggad!

Jag håller på och undersöker med vederbörande efter hur lång tid som han loggas ut för att det ska vägleda mig lite i felsökningen.

Vad kan problemet vara?

lillebrorMedlem sedan apr. 20041 597 inlägg
#2

Saknar jag något av följande kod (fetmarkerat)?

ini_set('session.gc_maxlifetime', 1200);
[B]session_cache_expire(1200);[/B]
[B]session_save_path($_SERVER['DOCUMENT_ROOT'] . "/sessions");[/B]
session_start();
spangoMedlem sedan juni 20008 205 inlägg
#3

lillebror skrev:

Vad kan problemet vara?

Att de tar mer än en timme på sig? :) Har du kollat med dem att de inte har dröjt längre än så?

lillebrorMedlem sedan apr. 20041 597 inlägg
#4

spango skrev:

Att de tar mer än en timme på sig? :) Har du kollat med dem att de inte har dröjt längre än så?

Det är precis det jag håller på och undersöker :) Skriver de vanliga inlägg eller skriver de en roman - det är frågan! :e

Har sökt på nätet efter information om sessioner och hur man hanterar det men jag tycker att det känns lite halvsnårigt om jag ska vara helt ärlig.

spangoMedlem sedan juni 20008 205 inlägg
#5

Det är väl inte speciellt anmärkningsvärt att ett inlägg tar över en timme från det att man trycker på "svara"-länken tills det att man trycker på "skicka". Man kollar upp nåt på Wikipedia, följer två länkar från den sidan, följer två länkar från varje sån sida, osv. Been there, done that :)

Du kan inte låta sessionerna leva hur länge som helst, en timme är mer än nog. Vill du att de ska hållas vid liv kan du lägga in små javascriptanrop som anropar ett serverscript som ser till att sessionen hålls levande. Kan öka på lasten på din server lite men har du bara tillräckligt långa intervall mellan anropen så borde det inte vara något nämnvärt problem (om man dessutom gör antagandet att de flesta av dina besökare inte kommer spendera den där timmen på skriv inlägg-sidan :) ).

colioneMedlem sedan juni 20014 421 inlägg
#6

Ett annat vanligt sätt är ju att använda vanliga cookies som har en viss livstid och kolla av den och om den inte är utgången så sätter du sessionen igen.

lillebrorMedlem sedan apr. 20041 597 inlägg
#7

spango skrev:

Du kan inte låta sessionerna leva hur länge som helst, en timme är mer än nog. Vill du att de ska hållas vid liv kan du lägga in små javascriptanrop som anropar ett serverscript som ser till att sessionen hålls levande. Kan öka på lasten på din server lite men har du bara tillräckligt långa intervall mellan anropen så borde det inte vara något nämnvärt problem (om man dessutom gör antagandet att de flesta av dina besökare inte kommer spendera den där timmen på skriv inlägg-sidan :) ).

Har du någon kod för dessa javascriptanrop? :)

spangoMedlem sedan juni 20008 205 inlägg
#8

Tja, det är väl inte speciellt komplicerat. Anta att du gör ett php-script (som vi kan kalla noop.php) som skyfflar igenom en 1x1 gif (eller skickar en 204, eller gör något annat okomplicerat) och ser till att sessionscookien uppdateras, så kan du göra det så här:

<script type="text/javascript">
function sessionKeepAlive(){
    var img = new Image();
    img.src = "/sökväg/till/noop.php";
}
function scheduleSessionKeepAlive(){
    var delay = 1000 * 60 * 55; // antal millisekunder att vänta innan anrop till noop.php, t.ex. 55 minuter
    setTimeout(sessionKeepAlive, delay);
}
scheduleSessionKeepAlive();
</script>

Då anropas noop.php med delay millisekunders intervall. Förhoppningsvis sätts då cookiens livslängd till ytterligare en timme i framtiden, med reservation för hur webbläsarna hanterar cookies osv :)

colioneMedlem sedan juni 20014 421 inlägg
#9

Det hade väl varitmer käckt att använda setInterval där? Om inläggskaparen skriver ett maraton-inlägg på 3 timmar? :) (Min poäng är väl att det är bättre att använda setinterval om det hela ska anropas mer än en gång)

"Bilden" kommer dessutom antagligen att cacheas, så något sånt här vore nog lämpligare:

<script type="text/javascript">
function sessionKeepAlive(){
    var img = new Image();
    img.src = "/sökväg/till/noop.php?foo="+Math.random();
}
function scheduleSessionKeepAlive(){
    var delay = 1000 * 60 * 55; // antal millisekunder att vänta innan anrop till noop.php, t.ex. 55 minuter
    setInterval(sessionKeepAlive, delay);
}
scheduleSessionKeepAlive();
</script>
spangoMedlem sedan juni 20008 205 inlägg
#10

colione skrev:

Det hade väl varitmer käckt att använda setInterval där?

Ja, jag skrev fel :r

lillebrorMedlem sedan apr. 20041 597 inlägg
#11

Tack för kodexemplet ovan!

Kan jag lägga javascriptet i min header.php-fil så att det laddas varje gång webbläsaren uppdateras eller var placeras det lämpligast?

Om en användare nu skriver på ett foruminlägg så kommer inte vederbörande att märka av att javaskriptet körs, eller?

Att mina sessionstider inte fungerar, kan det bero på att jag ligger på en server som "hostar" andra användare också?

Jag läste en intressant artikel som har med sessioner att göra och hur de tas bort från servern:

http://www.captain.at/howto-php-sessions.php

So we just changed the garbage collection timeout to one hour. There is just another problem. Since PHP stores all session files into one directory (e.g. /tmp on Linux) and the garbage collector can't tell the difference between the different gc_maxlifetime's of the individual session files, the session files are deleted by the garbage collector with the lowest timeout.

The solution for this problem is another session file directory. This is best accomplished by creating another directory *within* the regular session file directory.
First we read the current save path for the session files and append our own directory to this path. Note: In order to make that platform independent, we need to check for the file-seperator first. Now we check if the directory already has been created, if not, create one. Then we set the new path for the session files.

En följdfråga till citatet ovan. De sessioner som skapas för sidan https://www.flygfyren.nu, lagras de i samma sessionskatalog som de andra sidorna på min server? Jag tycker rensningen av sessioner på servern verkar ske minskt sagt lite slumpmässigt och godtyckligt.

spangoMedlem sedan juni 20008 205 inlägg
#12

lillebror skrev:

Kan jag lägga javascriptet i min header.php-fil så att det laddas varje gång webbläsaren uppdateras eller var placeras det lämpligast?

Om en användare nu skriver på ett foruminlägg så kommer inte vederbörande att märka av att javaskriptet körs, eller?

  1. Lägg det bara där du verkligen vill att sessionen ska hållas vid liv. Exempelvis i "kroppen" på din inläggssida. Spelar ingen roll om det ligger i body eller head.

  2. Nej, det ska man inte märka bortsett från att webbläsaren meddelar att den läser från servern när php-filen laddas (var 55:e minut, i exemplet).

lillebrorMedlem sedan apr. 20041 597 inlägg
#13

Jag har lagt in skriptet nu. Håller på och kör ett test med formulärsidan som används för nya inlägg för att se vad som händer efter 60 minuter. Återkommer med resultatet.

lillebrorMedlem sedan apr. 20041 597 inlägg
#14

Jag väntade i 90 minuter och lät skriptet köras varje minut. Trots detta så hade jag blivit utloggad (= sessionen borta) när jag skulle posta ett testinlägg i forumet.

Följande kod använde jag mig av:

<script type="text/javascript">
	function sessionKeepAlive(){
	    var img = new Image();
	    img.src = "/noop.php";
	}
	function scheduleSessionKeepAlive(){
	    var delay = 1000 * 60 * 1; // antal millisekunder att vänta innan anrop till noop.php, t.ex. 55 minuter
	    setInterval(sessionKeepAlive, delay);
	}
	scheduleSessionKeepAlive();
</script>

Noop-filen ser ut så här:

<?php 
$i = 1+1;
?>

Vad gör jag för fel?!

stevenetMedlem sedan juni 20001 251 inlägg
#15

Du måste starta sessionen i noop.php, annars gör det inga återupplivningsförsök. :)

lillebrorMedlem sedan apr. 20041 597 inlägg
#16

stevenet skrev:

Du måste starta sessionen i noop.php, annars gör det inga återupplivningsförsök. :)

Det var nog jag som tänkte fel. I vanliga fall när hela sidan laddas laddas ju header.php och där i ligger ju session_start().

Ska jag ha med följande kod i noop.php (detta är en del av koden från header.php)?

ini_set("session.gc_maxlifetime", "3600");
session_start(); # Startar sessionen på aktuell sida.
$sessionID = session_id();

eller räcker det med...

session_start(); # Startar sessionen på aktuell sida.
colioneMedlem sedan juni 20014 421 inlägg
#17

Varför tog du inte hela mitt script? Det finns en ganska stor chans att "bilden" blir cachead mellan gångerna och då inte laddas in...

Dessutom brukar det vara ganska enkelt att styra som session.save_path med hjälp av en .htaccess

Det gör su såhär: php_value session.save_path "/sessions" observera att /sessions måste vara skrivbar, därför ska du ha den utanför web-roten.

lillebrorMedlem sedan apr. 20041 597 inlägg
#18

colione skrev:

Varför tog du inte hela mitt script?.

Jag trodde jag kunde ha i princip vilken kod som helst i filen "noop.php". Det har alltså betydelse vad man har för innehåll i den?! :)

Ska man inte som någan sa i ett tidigare inlägg köra med session_start(); i den filen som anropas för att sessionen skall fortsätta vara aktiv?

colione skrev:

Dessutom brukar det vara ganska enkelt att styra som session.save_path med hjälp av en .htaccess

Blandas mina sessioner för Flygfyren med andra hemsidors sessioner i ett och samma bibliotek? Hur brukar det vara på "delade" servrar?

colione skrev:

Det gör su såhär: php_value session.save_path "/sessions" observera att /sessions måste vara skrivbar, därför ska du ha den utanför web-roten

Vad är fördelen med att göra ett eget bibliotek?

colioneMedlem sedan juni 20014 421 inlägg
#19

Jag har inte skrivit någon php-kod. Det jag lade till i spangos kod utöver setInterval var en querystring så varje sidanrop blir unikt, på det sättet minimeras cache risken.

Att du ska ha session_start i php-filen har du ju redan fått svar på.

Jag vet itne om de blandas, men om de gör det kan du ju prova att sätta en annan path för dina sessions. Jag tror dock inte att det gör så stor skillnad. Jag föredrar dock att ha dem i en av mig kontrollerad katalog eller databas.

144 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)