Bei der Erstellung von stark gleichzeitigen, verteilten oder langlebigen PHP-Anwendungen können herkömmliche Speichermethoden für Dateisystem-Sitzungen zu Spam-Spam-Datenakkumulation führen und die Leistung und Stabilität beeinflussen. Um dieses Problem zu lösen, bietet PHP eine SessionHandlerInterface -Schnittstelle, mit der Entwickler die Sitzungsspeicherlogik anpassen können, wobei die GC () -Methode der Schlüssel zur Steuerung des Müllreinigungsprozesses ist.
SessionHandlerInterface :: GC ist eine von dieser Schnittstelle definierte Methode. Seine Funktion ist aufgerufen, wenn festgestellt wird, dass die Sitzungsdaten innerhalb von PHP abgelaufen sind, um Müllabfuhrvorgänge auszuführen. Die Methodensignatur ist wie folgt:
public function gc(int $max_lifetime): int|false;
$ max_lifetime : repräsentiert die maximale Überlebenszeit (Einheit: Sekunden) der Sitzung.
Rückgabewert: Gibt die Anzahl der gereinigten Sitzungen oder den Erfolg des Erfolgs zurück und kehrt beim Versagen falsch zurück.
Wenn der Benutzer den Sitzungsprozessor (benutzerdefinierte Sitzungshandler) anpasst und die Schnittstelle implementiert, kann in dieser Methode eine Richtlinie zur Reinigung veralteter Sitzungsdaten definiert werden.
PHP verwendet standardmäßig einen dateibasierten Sitzungsspeicher, und sein GC-Mechanismus basiert auf der Wahrscheinlichkeitsauslöschung (gesteuert durch sessions.gc_probability und session.gc_divisor ), was bedeutet, dass die Reinigungslogik nicht jedes Mal ausgeführt wird, wenn es anfordert.
Zum Beispiel:
session.gc_probability = 1
session.gc_divisor = 1000
Es zeigt an, dass die Müllreinigung mit einer Wahrscheinlichkeit von 1/1000 ausgelöst wird. Diese Strategie kann abgelaufene Sitzungsakkumulation in Systemen mit niedrigem Handel verursachen, die häufig in hohen Verkehrssystemen ausgelöst werden können, was die Leistung beeinflusst.
Im Folgenden finden Sie ein benutzerdefiniertes SessionHandler -Beispiel, das auf Datenbankspeicher basiert und zeigt, wie die Leistung verbessert wird, indem die GC () -Methode optimiert wird.
class DbSessionHandler implements SessionHandlerInterface {
protected $db;
public function __construct(PDO $db) {
$this->db = $db;
}
public function open($savePath, $sessionName): bool {
return true;
}
public function close(): bool {
return true;
}
public function read($id): string|false {
$stmt = $this->db->prepare("SELECT data FROM sessions WHERE id = :id AND expires > :now");
$stmt->execute([':id' => $id, ':now' => time()]);
return (string) $stmt->fetchColumn();
}
public function write($id, $data): bool {
$expires = time() + (int)ini_get("session.gc_maxlifetime");
$stmt = $this->db->prepare("
REPLACE INTO sessions (id, data, expires) VALUES (:id, :data, :expires)
");
return $stmt->execute([
':id' => $id,
':data' => $data,
':expires' => $expires,
]);
}
public function destroy($id): bool {
$stmt = $this->db->prepare("DELETE FROM sessions WHERE id = :id");
return $stmt->execute([':id' => $id]);
}
public function gc($max_lifetime): int|false {
$stmt = $this->db->prepare("DELETE FROM sessions WHERE expires < :time");
$stmt->execute([':time' => time()]);
return $stmt->rowCount();
}
}
In der obigen Implementierung löscht die GC () -Methode alle abgelaufenen Sitzungsdatensätze aus der Datenbank explizit. Im Vergleich zum Standardwahrscheinlichkeitsbasis-basierten GC ist diese Methode zuverlässiger und kann mit System-Timing-Aufgaben (wie Cron) verwendet werden, um eine regelmäßige Reinigung zu erzielen.
Sobald Sie einen benutzerdefinierten Prozessor definiert haben, können Sie ihn auf folgende Weise aktivieren:
$handler = new DbSessionHandler($pdo);
session_set_save_handler($handler, true);
session_start();
Wenn Sie ein Datenbankreinigungsskript oder ein Task -Scheduler verwenden, können Sie die Sitzung.gc_probability auf 0 festlegen, um automatisch GC vollständig auszuschalten:
session.gc_probability = 0
Dann regelmäßig in der geplanten Aufgabe ausführen:
$handler->gc(1440); // Zum Beispiel jeweils24Einmal in Minuten aufräumen
Zusätzlich zu Datenbanken können die Sitzungs- und GC -Mechanismen der Sitzung und GC auch auf der Basis von Redis, Memcached usw. erstellt werden. Bei der Verwendung von Redis kann es beispielsweise automatisch mit seinem TTL -Mechanismus ablaufen, ohne die komplexen GC () -Methoden manuell zu implementieren:
$redis->setex("sess_$id", $max_lifetime, $data);
Weitere Beispiele finden Sie unter https://m66.net/examples/session-handler .
Durch die Implementierung der SessionHandlerInterface :: GC () -Methode können PHP-Entwickler die vollständige Kontrolle über Sitzungsmüllreinigung erhalten, was für den Aufbau von skalierbaren Webanwendungen von Hochleistungen von entscheidender Bedeutung ist. Unabhängig davon, ob Datenbanken, Redis oder andere Middleware, die rationale Verwendung von GC () und Planungstools auf Systemebene, können die Effizienz und die Wartbarkeit von Systemen erheblich verbessern.
Verwandte Tags:
SessionHandlerInterface