Entwickler können feststellen, dass auch wenn der Sitzungslebenszyklus festgelegt ist, alte Sitzungsdaten noch lange vorhanden sind. Dies liegt normalerweise daran, dass Session_gc () jede Anfrage nicht ausführt.
Ursache Analyse:
Der Recycling -Mechanismus von PHP wird basierend auf der Wahrscheinlichkeit ausgelöst, und die Standardkonfiguration lautet wie folgt:
session.gc_probability = 1
session.gc_divisor = 100
Dies bedeutet, dass im Durchschnitt nur 1 von 100 Anfragen den GC -Betrieb auslösen.
Lösung:
Sie können die Reinigung erzwingen, indem Sie die GC -Triggerwahrscheinlichkeit erhöhen oder manuell auf Session_GC () aufrufen:
ini_set('session.gc_probability', 100);
ini_set('session.gc_divisor', 100);
Oder zur richtigen Zeit verwenden:
session_start();
session_gc();
Problembeschreibung:
GC scheint bei Verwendung maßgeschneiderter Mechanismen für Sitzungsparen (wie Datenbanken, Redis usw.) keine Wirkung zu haben.
Ursache Analyse:
Wenn die GC () -Methode in der benutzerdefinierten SessionHandler -Klasse nicht korrekt implementiert ist, werden die Daten nicht tatsächlich gereinigt, wenn PHP Session_GC () aufruft.
Lösung:
Stellen Sie sicher, dass die GC () -Methode in SessionHandlerInterface implementiert ist. Wenn Sie beispielsweise MySQL verwenden, um die Sitzung zu speichern, können Sie sie so implementieren:
class MySessionHandler implements SessionHandlerInterface {
// ...
public function gc($max_lifetime) {
$stmt = $this->pdo->prepare("DELETE FROM sessions WHERE last_access < :time");
$stmt->execute([':time' => time() - $max_lifetime]);
return true;
}
}
Dann registrieren Sie sich:
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
Problembeschreibung:
Auch wenn Session_gc () aufgerufen wird, wird die alte Sitzungsdatei immer noch nicht gelöscht.
Ursache Analyse:
Dies kann daran liegen, dass Session.save_path auf das falsche Verzeichnis oder unzureichende Berechtigungen zeigt.
Lösung:
Stellen Sie sicher, dass der richtige Speicherpfad festgelegt ist und dass der PHP -Prozess die Erlaubnis zum Lesen und Schreiben enthält:
ini_set('session.save_path', '/var/lib/php/sessions');
Überprüfen Sie die Ordnerberechtigungen:
sudo chown -R www-data:www-data /var/lib/php/sessions
sudo chmod 700 /var/lib/php/sessions
Problembeschreibung:
Das Aufrufen von Session_GC () im CLI -Modus (z. B. Timing -Skripte) hat keinen Einfluss oder ein Fehler wird gemeldet.
Ursache Analyse:
Die CLI -Umgebung kann nicht die korrekte Sitzungskonfiguration initialisieren (z. B. SAVE_PATH ist leer), oder die Sitzung wird nicht initialisiert, bevor der Anruf aufgerufen wird.
Lösung:
Stellen Sie sicher, dass Sie die Umgebung explizit konfigurieren, bevor Sie Session_GC () aufrufen:
ini_set('session.save_handler', 'files');
ini_set('session.save_path', '/var/lib/php/sessions');
session_gc();
Problembeschreibung:
Nachdem einige Websites für lange Zeit ausgeführt wurden, wird eine große Anzahl von .S -Dateien im Verzeichnis /TMP gespeichert, das viel Speicherplatz einnimmt.
Ursache Analyse:
Wenn für lange Zeit kein effektiver GC durchgeführt wird oder die GC -Häufigkeit zu niedrig ist, was dazu führt, dass die historischen Sitzungsdaten nicht gereinigt werden.
Lösung:
Es wird empfohlen, ein separates geplantes Task -Skript und Call Session_GC () regelmäßig einzurichten, beispielsweise einmal eine Stunde auszuführen:
<?php
ini_set('session.save_path', '/var/lib/php/sessions');
session_gc();
Kombiniert mit Linux -Cron -Aufgaben:
0 * * * * /usr/bin/php /var/www/html/session_gc.php
Problembeschreibung:
In der Lastausgleichs- oder Reverse -Proxy -Umgebung synchronisieren verschiedene Knoten keine Sitzungsdaten, was zu einer inkonsistenten GC -Reinigung führt.
Lösung:
Es wird empfohlen, einen zentralen Sitzungsspeicher wie Redis oder Datenbanken zu verwenden und die GC -Richtlinie zu vereinheitlichen:
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://gitbox.net:6379');
Im Redis -Schema sollte der Verfallsmechanismus von Redis regelmäßig oder automatisch mit Redis gereinigt werden.