Heim >Backend-Entwicklung >PHP-Problem >So legen Sie die Ablaufzeit in PHP fest

So legen Sie die Ablaufzeit in PHP fest

藏色散人
藏色散人Original
2020-11-04 11:38:553741Durchsuche

So legen Sie die Ablaufzeit in PHP fest: Legen Sie zuerst die Sitzung fest und lesen Sie sie. Löschen Sie dann die Sitzung durch „unset($_SESSION[$name]);“ und geben Sie schließlich „session::get(‘test‘)“ aus. ;" ist abgelaufen. Das war's.

So legen Sie die Ablaufzeit in PHP fest

Empfohlen: „PHP-Video-Tutorial

Legen Sie die Sitzungsablaufzeit in PHP streng fest!

Beschränken Sie den Ablauf der Sitzung unbedingt auf 30 Minuten!

1. Stellen Sie die Lebensdauer des Client-Cookies auf 30 Minuten ein.

3. Fügen Sie zu jedem Sitzungswert einen Zeitstempel hinzu heißt;

Was den Grund betrifft, wollen wir zunächst die Grundprinzipien von Sitzungen in PHP verstehen:

Die standardmäßige Sitzungsgültigkeitsdauer in PHP beträgt 1440 Sekunden (24 Minuten), das heißt, wenn der Client nicht länger aktualisiert wird als 24 Minuten, läuft die aktuelle Sitzung ab. Wenn der Benutzer den Browser schließt, wird die Sitzung natürlich beendet und die Sitzung existiert natürlich nicht mehr!

Wie wir alle wissen, wird die Sitzung auf der Serverseite gespeichert, basierend auf der vom Client bereitgestellten Sitzungs-ID, und dann wird die Datei gelesen, um den Wert der Variablen zu erhalten Ein Cookie oder der

Query_String des Http1.1-Protokolls (das ist der Teil nach dem „?“ der aufgerufenen URL) wird an den Server übertragen, und dann liest der Server das Verzeichnis der Sitzung...

Zur Steuerung Um den Lebenszyklus der Sitzung zu verstehen, müssen wir zunächst die relevanten Einstellungen der Sitzung in php.ini verstehen (öffnen Sie die php.ini-Datei im Abschnitt „[Sitzung]“):

1 ist „1“, was bedeutet, dass SessionID von Query_String übergeben wird.

2: Dies ist der in SessionID gespeicherte Variablenname ist „PHPSESSID“;

3. Dies ist die Zeit, in der die SessionID im Client-Cookie gespeichert wird Aus diesem Grund kann die Session nicht dauerhaft genutzt werden!

4. session.gc_maxlifetime: Dies ist die Zeit, die Sitzungsdaten auf der Serverseite gespeichert werden. Wenn diese Zeit überschritten wird, werden die Sitzungsdaten automatisch gelöscht!

Es gibt noch viele weitere Einstellungen, aber diese beziehen sich auf diesen Artikel. Beginnen wir mit der Festlegung des Sitzungsüberlebenszyklus.

Wie bereits erwähnt, liest der Server Sitzungsdaten über die Sitzungs-ID, aber im Allgemeinen ist die vom Browser gesendete Sitzungs-ID nach dem Schließen des Browsers verschwunden, sodass wir die Sitzungs-ID nur manuell festlegen und speichern müssen, nein ...

Wenn Sie haben die Betriebsberechtigung des Servers, dann ist die Einstellung sehr, sehr einfach. Sie müssen nur die folgenden Schritte ausführen:

1. Setzen Sie „session.use_cookies“ auf 1 und verwenden Sie Cookie, um die Sitzungs-ID zu speichern 1, im Allgemeinen keine Änderung erforderlich;

2. Ändern Sie „session.cookie_lifetime“ auf die Zeit, die Sie einstellen müssen (z. B. eine Stunde, Sie können sie auf 3600 einstellen,

3). .gc_maxlifetime“ zu und Die gleiche Zeit wie „session.cookie_lifetime“;

In der PHP-Dokumentation wird eindeutig angegeben, dass der Parameter zum Festlegen der Sitzungsgültigkeitsdauer session.gc_maxlifetime ist. Dieser Parameter kann in der Datei php.ini oder über die Funktion ini_set() geändert werden. Das Problem besteht darin, dass die Änderung dieses

-Parameters nach vielen Tests grundsätzlich keine Auswirkung hat und die Gültigkeitsdauer der Sitzung weiterhin den Standardwert von 24 Minuten beibehält.

Aufgrund des Arbeitsmechanismus von PHP gibt es keinen Daemon-Thread, um Sitzungsinformationen regelmäßig zu scannen und festzustellen, ob sie ungültig sind. Wenn eine gültige Anfrage auftritt, entscheidet PHP basierend auf dem Wert der globalen Variablen

session.gc_probability/session.gc_divisor (die auch über php.ini oder ini_set() geändert werden kann) ob ein GC (Garbage Collector) gestartet wird. Funktion).

Standardmäßig ist session.gc_probability = 1, session.gc_divisor = 100, was bedeutet, dass die Wahrscheinlichkeit, dass GC gestartet wird, bei 1 % liegt. Die Aufgabe des GC besteht darin, alle Sitzungsinformationen zu scannen, das letzte Änderungsdatum der Sitzung von der aktuellen Zeit zu subtrahieren und es mit dem Parameter session.gc_maxlifetime zu vergleichen. Wenn die Überlebenszeit gc_maxlifetime überschritten hat, wird die Sitzung gelöscht.

Bis jetzt funktioniert alles bestens. Warum wird gc_maxlifetime ungültig?

Standardmäßig werden Sitzungsinformationen in Form von Textdateien im temporären Dateiverzeichnis des Systems gespeichert. Unter Linux ist dieser Pfad normalerweise \tmp und unter Windows normalerweise C:\Windows\Temp. Wenn mehrere PHP-Anwendungen auf dem Server vorhanden sind, speichern diese ihre Sitzungsdateien im selben Verzeichnis. Ebenso starten diese PHP-Anwendungen mit einer bestimmten Wahrscheinlichkeit auch GC und scannen alle Sitzungsdateien.

Das Problem besteht darin, dass GC beim Betrieb nicht zwischen Sitzungen auf verschiedenen Websites unterscheidet. Beispielsweise ist gc_maxlifetime für Standort A auf 2 Stunden und gc_maxlifetime für Standort B auf den Standardwert von 24 Minuten festgelegt. Wenn der GC von Site B startet, wird er gescannt

Scannen Sie das öffentliche temporäre Dateiverzeichnis und löschen Sie alle Sitzungsdateien, die älter als 24 Minuten sind, unabhängig davon, ob sie von Site A oder B stammen. Auf diese Weise ist die gc_maxlifetime-Einstellung von Site A nutzlos.

Sobald Sie das Problem gefunden haben, ist es einfach, es zu lösen. Ändern Sie den Parameter session.save_path oder verwenden Sie die Funktion session_save_path(), um das Verzeichnis, in dem die Sitzung gespeichert wird, auf ein dediziertes Verzeichnis zu verweisen. Der Parameter gc_maxlifetime funktioniert normal.

Ein weiteres Problem besteht darin, dass gc_maxlifetime nur die kürzeste Überlebenszeit der Sitzung garantieren kann und nicht gespeichert werden kann. Nach dieser Zeit werden die Sitzungsinformationen sofort gelöscht. Da GC auf Wahrscheinlichkeitsbasis gestartet wird, kann es sein, dass es über einen längeren Zeitraum nicht gestartet wird, sodass eine große Anzahl von Sitzungen auch nach Überschreiten von gc_maxlifetime noch gültig ist.

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, die Wahrscheinlichkeit von session.gc_probability/session.gc_divisor zu erhöhen. Wenn es zu 100 % erwähnt wird, wird dieses Problem vollständig gelöst, aber es wird offensichtlich schwerwiegende Auswirkungen auf die Leistung haben. Eine andere Methode besteht darin, es selbst zu implementieren

nur mit PHP, eine Sitzungsklasse zu erstellen und die Ablaufzeit beim Schreiben der Sitzung zu schreiben. Stellen Sie beim Lesen anhand der Ablaufzeit fest, ob es abgelaufen ist.

class Session{  
      
        /** 
         * 设置session 
         * @param String $name   session name 
         * @param Mixed  $data   session data 
         * @param Int    $expire 超时时间(秒) 
         */  
        public static function set($name, $data, $expire=600){  
            $session_data = array();  
            $session_data['data'] = $data;  
            $session_data['expire'] = time()+$expire;  
            $_SESSION[$name] = $session_data;  
        }  
      
        /** 
         * 读取session 
         * @param  String $name  session name 
         * @return Mixed 
         */  
        public static function get($name){  
            if(isset($_SESSION[$name])){  
                if($_SESSION[$name]['expire']>time()){  
                    return $_SESSION[$name]['data'];  
                }else{  
                    self::clear($name);  
                }  
            }  
            return false;  
        }  
      
        /** 
         * 清除session 
         * @param  String  $name  session name 
         */  
        private static function clear($name){  
            unset($_SESSION[$name]);  
        }  
      
    }  
    demo.php  
      
    session_start();  
      
    $data = '123456';  
    session::set('test', $data, 10);  
    echo session::get('test'); // 未过期,输出  
    sleep(10);  
    echo session::get('test'); // 已过期

Das obige ist der detaillierte Inhalt vonSo legen Sie die Ablaufzeit in PHP fest. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn