Session_GC () ist eine interne Funktion von PHP, und seine Funktion besteht darin, den Müllsammlung Mechanismus der Sitzung auszuführen. PHP löst diese Funktion mit einer bestimmten Wahrscheinlichkeit in Benutzeranforderungen zum Reinigen abgelaufener Sitzungsdateien aus. Das Standardverhalten wird durch die folgenden drei Konfigurationselemente bestimmt:
ini_get('session.gc_probability'); // Standardwert:1
ini_get('session.gc_divisor'); // Standardwert:100
ini_get('session.gc_maxlifetime'); // Standardwert:1440 Zweite(24 Minute)
Das heißt: In 100 Anfragen besteht die Wahrscheinlichkeit, dass Session_GC ausgelöst wird, wodurch alle Sitzungsdateien gelöscht werden, die gc_maxlifetime übersteigen.
PHP speichert standardmäßig Sitzungsdaten im Dateisystem des Servers (normalerweise im Verzeichnis /TMP ). Jedes Mal, wenn Session_GC ausgeführt wird, muss PHP alle Sitzungsdateien in diesem Verzeichnis scannen, um festzustellen, welche Sitzungen abgelaufen sind. Dieser Vorgang ist unempfindlich, wenn die Anzahl der Sitzungsdateien gering ist, kann jedoch zu einem erheblichen E/A -Overhead führen, wenn eine hohe Parallelität oder die Sitzungsaufbewahrungszeit lang ist.
Wenn mehrere Anfragen gleichzeitig Trigger Session_GC ausgelöst werden, kann dies zu einem Sperrwettbewerb führen, was wiederum eine Anforderung Blockade verursacht. Dies ist besonders gefährlich in Systemen mit hoher Konsequenz. Zumindest reduziert es die Reaktionsgeschwindigkeit und füllt im schlimmsten Fall direkt die Serverlast.
Der häufigste Ansatz besteht darin, den automatischen GC von PHP auszuschalten, damit das System auf kontrolliertere Weise (z. B. Cron -Timing -Aufgaben) auf die Müllsammlung abholen kann:
ini_set('session.gc_probability', 0);
Richten Sie dann eine zeitgesteuerte Aufgabe ein, z. B. alle 5 Minuten die Reinigungslogik durchführen:
*/5 * * * * php /var/www/html/session_gc.php
Der Beispiel -Code von Session_gc.php lautet wie folgt:
<?php
ini_set('session.save_path', '/var/www/html/sessions');
ini_set('session.gc_maxlifetime', 3600); // Ablaufzeit festlegen
session_start();
session_gc(); // Manuell aufräumen
Durch Konfigurieren von Sitzungen.Save_handler in Memcached oder Redis kann die Leseeffizienz der Sitzung erheblich verbessert werden und die Leistungsprobleme des PHP -Dateisystems GC können mit Hilfe der nativen Ablaufstrategien dieser Systeme vermieden werden:
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://gitbox.net:6379');
Der eigene TTL -Mechanismus von Redis kann automatisch abgelaufene Sitzungen ohne manuelle Intervention löschen.
Ab PHP 7.1 wurde das Konfigurationselement der Sitzung . Obwohl es keine direkte Beziehung zu Session_GC hat, kann es unnötige Schreibvorgänge verringern und die Leistung indirekt verbessern:
ini_set('session.lazy_write', 1);
In einem B2C -Einkaufszentrum mit großen Besuchen führte die ursprüngliche Konfiguration dazu, dass sich Hunderttausende von Sitzungsdateien unter /TMP ansammeln. Jede Session_GC -Ausführung führte dazu, dass die CPU stieg und die Seitenantwortzeit erheblich zunahm.
Der Optimierungsplan lautet wie folgt:
Schalten Sie den automatischen GC aus;
Verwenden Sie Redis, um Sitzungen zu speichern;
Die Hintergrundaufgabe führt jeden Tag um 2 Uhr morgens einzelnen Session_gc () (alternativ) aus;
Passen Sie die Sitzung an.
Nach dem Online -Gehen sank die Gesamtsystemreaktionszeit im Durchschnitt um 30% und die GC -Ausführungszeit wurde von einigen Sekunden auf einige zig Millisekunden verkürzt.
Obwohl Session_GC eine "Backend -Aufgabe" ist, kann sein Standardverhalten zu einem Performance -Engpass bei hohen Parallelitätsszenarien werden. Das Verständnis der Prinzipien und das Anpassen von Konfigurationen auf der Grundlage der tatsächlichen Geschäftsszenarien kann die Stabilität und Leistung von PHP -Anwendungen effektiv verbessern.
Best Practice Zusammenfassung:
Deaktivieren Sie den automatischen GC in großen Projekten und verwenden Sie Zeitaufgaben.
Versuchen Sie, Redis/Memcached zu verwenden, um Sitzungen zu speichern.
Konfigurieren Sie GC_MAXLIFETIME mit angemessener Konfiguration;
Verwenden Sie Session.lazy_Write , um die Schreibvorgänge zu reduzieren.
Das Beherrschen dieser Fähigkeiten ist kein Leistungsmangel mehr.