2010-08-13 13 views
29

Ich benutze PHP-Sitzungen auf meiner Website und es scheint, als würden sie in zufälligen Abständen "verschwinden". Ich weiß nicht, ob sie wegen Inaktivität auslaufen oder wenn etwas mit meinem Code nicht stimmt, aber gibt es eine Möglichkeit, die Sitzungen zu kontrollieren, wenn sie ablaufen?PHP-Sitzungen Zeit zu schnell zu timing

Wie kann ich etwas in meinen Code einfügen oder etwas in der Datei php.ini ändern?

Update- Also nur und aktualisieren Sie hier, ich wechselte Hosts und magisch die Sitzungen begannen zu arbeiten. Ich habe keine Ahnung, was falsch war, aber anscheinend wollten sie nicht richtig arbeiten.

+2

Sie finden Ihre Antwort hier: http://stackoverflow.com/questions/1516266/how-long-will-my-session-last/1516284 – svens

+2

Das war super danke. Es war tatsächlich das, das am Ende sehr hilfreich war: http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960 – jefffan24

+1

Das war sogar mehr toll, danke :) – svens

Antwort

42

Zufälliges Ablaufdatum ist ein klassisches Symptom des Sitzungsdatenverzeichnisses, das von mehreren Anwendungen gemeinsam genutzt wird: Dasjenige mit der kürzesten Zeit session.gc_maxlifetime entfernt wahrscheinlich Daten aus anderen Anwendungen. Der Grund:

  1. PHP speichert Session-Dateien standardmäßig im temporären Systemverzeichnis.
  2. Der eingebaute Dateihandler verfolgen nicht, wer was besitzt Session-Datei (es passt nur Dateinamen mit Session-ID):

    Nothing bug good old files

Mein Rat ist, dass Sie eine private benutzerdefinierte Sitzung konfigurieren Verzeichnis für Ihre Anwendung. Dies kann mit der session_save_path() function oder der session.save_path configuration directive vorgenommen werden. In der Dokumentation zu Ihrem Framework finden Sie die genauen Details zur Vorgehensweise in Ihrer eigenen Codebasis.

+0

Schlägst du vor, dies auf jeder Seite einzufügen? – JM4

+3

@ JM4 - Werfen Sie einen Blick auf die [include] (http://php.net/include) Familie von Aussagen. –

+0

ich verstehe, einschließlich und erfordert. Wenn das OP Hunderte oder Tausende von Seiten hat, wäre dies ein Albtraum, wenn nicht gar unmöglich. Suchen und Ersetzen ist möglich, wenn man davon ausgeht, dass alle Seiten eine Art Grundstruktur haben, aber dennoch wie eine wirklich seltsame Methode erscheinen. – JM4

2

Versuchen, diesen Teil des Codes verwenden:

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

Okay, ich habe eine Bibliothek PHP-Seite, die auf jeder Seite der Website enthalten ist, nehme ich an, wenn sie sich einloggen, würde ich das Session-Timeout starten. Würde ich diesen Code in der Bibliothek verwenden, damit er jedes Mal, wenn er eine Seite lädt, seine Aktivität aktualisiert? – jefffan24

+0

Dies wird jede Sitzung nach 10 Minuten Inaktivität zerstören. Lösche alles, erwarte die erste und die letzte Zeile dieses Codes und du hast die richtige Antwort auf die Frage. – svens

+2

Und für die Liebe zum Guten, testen Sie die Existenz von Variablen, bevor Sie sie verwenden! Angenommen, $ _SESSION ['timeout'] ist gültig, ist schlecht (TM) – Fake51

6

Sie es Technik verwenden, können Sie nach kompatibeler Anwendung zu machen .. Sie müssen einige Änderungen entsprechend Ihr System

// Get the current Session Timeout Value 
$currentTimeoutInSecs = ini_get(’session.gc_maxlifetime’); 

Ändern Sie den Sitzungszeitüberschreitungswert

// Change the session timeout value to 30 minutes // 8*60*60 = 8 hours 
ini_set(’session.gc_maxlifetime’, 30*60); 
//————————————————————————————– 

// php.ini setting required for session timeout. 

ini_set(‘session.gc_maxlifetime’,30); 
ini_set(‘session.gc_probability’,1); 
ini_set(‘session.gc_divisor’,1); 

//if you want to change the session.cookie_lifetime. 
//This required in some common file because to get the session values in whole application we need to  write session_start(); to each file then only will get $_SESSION global variable values. 

$sessionCookieExpireTime=8*60*60; 
session_set_cookie_params($sessionCookieExpireTime); 
session_start(); 

// Reset the expiration time upon page load //session_name() is default name of session PHPSESSID 

if (isset($_COOKIE[session_name()])) 
    setcookie(session_name(), $_COOKIE[session_name()], time() + $sessionCookieExpireTime, “/”); 
    //————————————————————————————– 
    //To get the session cookie set param values. 

    $CookieInfo = session_get_cookie_params(); 

    echo “<pre>”; 
    echo “Session information session_get_cookie_params function :: <br />”; 
    print_r($CookieInfo); 
    echo “</pre>”; 

Alles Gute !!!!

+4

Es tut tatsächlich. Sie denken wahrscheinlich an den Cookie-Ablauf. –

12

Debian verwendet einen Cron-Job, um Sitzungen automatisch auf sichere Weise ablaufen zu lassen. Wenn Sie Debian verwenden, sehen Sie sich /etc/cron.d/php5 an.

+0

Ubuntu hat auch eine '/ etc/cron.d/php', die' session.gc_maxlifetime' in '/ etc/php/7.0/fpm/php.ini' verwendet, um Sitzungen aus'/var/lib/php/sessions zu entfernen '. –