1.6k Aufrufe
Gefragt in Skripte(PHP,ASP,Perl...) von
Hallo alle miteinander,

ich bin grade dabei, mir ein einfaches automatisches Logout zu basteln. Leider
funktioniert es nicht so, wie es sollte.

Hier der Quelltext:

<?php
session_start();
$inactive = 10; // Set timeout period in seconds

if (isset($_SESSION['timeout'])) {
$session_life = time() - $_SESSION['timeout'];
if ($session_life > $inactive) {
session_destroy();
header("Location: logoutpage.php");
}
}
$_SESSION['timeout'] = time();
?>


Kann mir jemand sagen, ob hier ein Fehler im Quelltext vorliegt? Habe schon
mehrfach in einer Suchmaschine gesucht, aber stoße immer auf denselben Code.
Auf meinem Computer nutze ich den XAMPP-Server für Windows 7.

5 Antworten

0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo,

bei jedem Durchlauf des Codes wird timeout neu gesetzt. Du solltest das Setzen von Timeout in ein else Statement setzen und nur durchführen, wenn timeout noch nicht definiert war.

if (isset($_SESSION['timeout'])) {
$session_life = time() - $_SESSION['timeout'];
if ($session_life > $inactive) {
session_destroy();
header("Location: logoutpage.php");
}
}
else
$_SESSION['timeout'] = time();


Gruß
computerschrat
0 Punkte
Beantwortet von
Ich habe das jetzt ausprobiert, wie du geschrieben hast. Es wird
allerdings weiterhin kein Code ausgeführt.

wenn ich dies $inactive-Variable auf den Wert 10 setze und dann frage,
ob $session_life größer oder gleich $inactive ist, passiert einfach nichts
(Testhalber soll er mir einfach das Wort TEST ausgeben).


if ($session_life > $inactive) {
session_destroy();
echo 'test';
}
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo,

wo steht dieser Code denn? wird der überhaupt zyklisch ausgeführt?
Normalerweise wird der Code für eine Seite beim Aufruf der Seite einmal ausgeführt und das war es dann. Anschließend wartet der Server auf eine Rückmeldung des Clients um wieder etwas zu tun.

Gruß
computerschrat
0 Punkte
Beantwortet von

session_start();

$inactive = 10;

if (isset($_SESSION['timeout'])) {
$session_life = time() - $_SESSION['timeout'];
if ($session_life > $inactive) {
session_destroy();
echo 'test';
}
}
else
$_SESSION['timeout'] = time();


Den Code selbst habe ich erstmal an den Dateianfang getan (wie
gesagt: zu Testzwecken).

Du nimmst mir die Worte aus dem Mund mit dem zyklischen Aufruf.
Der Client (also ich) rufe die Seite ja logischerweise nur einmal auf,
um den aktuellen Timestamp zu erhalten. Habe ich den, möchte ich
ja nix anderes, als diesen um eine gewisse Anzahl Sekunden
hochzuzählen. Sobald diese um sind ist, soll der Logout erfolgen.
Also muss ich über einen zweiten Timestamp mit Ersten subtrahieren
und mit der Anzahl an Sekunden vergleichen. Also genau der Code,
über den wir die ganze Zeit sprechen.

Aber momentan stehe ich da völlig aufm Schlauch, weil ich nicht
weiß, wie ich das dem Server klarmachen kann.
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo,

du könntest die Seite zyklisch aufrufen lassen. Mit dem folgenden Statement ruft der Browser die Seite alle 30 Sekunden neu auf. Die Zeit kannst du beliebig einstellen.
Wenn die Seite etwas komplexer ist, belastest du natürlich die Leitungen und der Bildschirm beim Client flackert eventuell. Aber es sollte funktionieren. Wichtig ist, dass dass die unten gezeigte Zeile die erste Zeile der Seite mit einer Ausgabe ist. Danach kann stehen was will, aber vorher darf keine Ausgabe sein.

<head>
<meta http-equiv="refresh" content="30; url=<?php echo $_SERVER['PHP_SELF']; ?>" />

</head>


Gruß
computerschrat
...