In der modernen Webentwicklung ist das Sitzungsmanagement von PHP eine Schlüsselkomponente, mit der der Status der Benutzer beibehalten und sicherstellen kann, dass Benutzerdaten zwischen verschiedenen Seitenanforderungen gespeichert und übergeben werden. Herkömmliche Sitzungsspeichermethoden basieren auf Dateisystemen, aber in einigen Szenarien mit hoher Last und mit hoher Konsequenzanwendung kann der Dateispeicher Leistungs Engpässe bringen. Daher ist die Verwendung von Datenbanken zum Speichern von Sitzungsinformationen nach und nach zu einer gängigen Praxis geworden.
In PHP bietet die SessionHandler -Klasse einen Mechanismus, mit dem Entwickler Sitzungsspeichermethoden anpassen können. Durch die Implementierung der SessionHandler -Schnittstelle können Sitzungen in der Datenbank gespeichert werden, wodurch das Sitzungsmanagement effizienter und stabiler wird.
In diesem Artikel wird erläutert, wie der Sitzungsspeicher über SessionHandler :: Open with Database implementiert und wie ein effizientes und stabiles Datenbanksitzungssystem implementiert wird.
Die integrierte Sitzungsverarbeitungsmethode von PHP (standardmäßig, Dateispeicher) kann durch einen benutzerdefinierten Sitzungshandler ersetzt werden. Wenn PHP eine Sitzung fordert, führt SessionHandler die folgenden Hauptmethoden aus:
Open ($ SavePath, $ SessionName) : Aufbewahrung von Sitzungen.
Close () : Sitzung schließen.
Read ($ SessionID) : Lesen Sie Sitzungsdaten der angegebenen Sitzungs -ID.
Write ($ SessionID, $ data) : Sitzungsdaten schreiben.
zerstören ($ sessionID) : Zerstöre die Sitzung.
GC ($ maxlifetime) : führt Müllsammlung aus.
Durch die Umschreiben dieser Methoden können Entwickler Sitzungsdaten in eine Datenbank speichern, anstatt sich ausschließlich auf das Dateisystem zu verlassen.
Im Folgenden finden Sie die grundlegenden Schritte zum Speichern von Sitzungsdaten in der Datenbank über PHP:
Zunächst müssen Sie eine Tabelle in der Datenbank erstellen, um Sitzungsinformationen zu speichern. Ein grundlegendes Beispiel für eine Tabellenstruktur ist:
<span><span><span class="hljs-keyword">CREATE</span></span><span> </span><span><span class="hljs-keyword">TABLE</span></span><span> `sessions` (
`session_id` </span><span><span class="hljs-type">varchar</span></span><span>(</span><span><span class="hljs-number">255</span></span><span>) </span><span><span class="hljs-keyword">NOT</span></span><span> </span><span><span class="hljs-keyword">NULL</span></span><span>,
`session_data` text </span><span><span class="hljs-keyword">NOT</span></span><span> </span><span><span class="hljs-keyword">NULL</span></span><span>,
`last_access` </span><span><span class="hljs-type">int</span></span><span>(</span><span><span class="hljs-number">11</span></span><span>) </span><span><span class="hljs-keyword">NOT</span></span><span> </span><span><span class="hljs-keyword">NULL</span></span><span>,
</span><span><span class="hljs-keyword">PRIMARY</span></span><span> KEY (`session_id`)
);
</span></span>
In dieser Tabelle verwenden wir Session_ID als eindeutige Kennung der Sitzung, Session_Data speichert Sitzungsdaten, und Last_access wird verwendet, um die letzte Zugriffszeit der Sitzung aufzuzeichnen.
Als nächstes wird eine Klasse, die den SessionHandler erbt, entwickelt, um die Funktion des Sitzungsspeichers zu implementieren.
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">DbSessionHandler</span></span><span> </span><span><span class="hljs-keyword">extends</span></span><span> </span><span><span class="hljs-title">SessionHandler</span></span><span>
{
</span><span><span class="hljs-keyword">protected</span></span><span> </span><span><span class="hljs-variable">$db</span></span><span>;
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">__construct</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$db</span></span></span><span>)
{
</span><span><span class="hljs-variable language_">$this</span></span><span>->db = </span><span><span class="hljs-variable">$db</span></span><span>;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">open</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$savePath</span></span></span><span>, </span><span><span class="hljs-variable">$sessionName</span></span><span>)
{
</span><span><span class="hljs-comment">// Sie können die Initialisierungsoperation der Datenbankverbindung hier durchführen</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">close</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
{
</span><span><span class="hljs-comment">// Sie können die Datenbankverbindung hier schließen</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">read</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
{
</span><span><span class="hljs-comment">// Lesen Sie Sitzungsdaten aus der Datenbank</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->db-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"SELECT session_data FROM sessions WHERE session_id = :session_id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'session_id'</span></span><span> => </span><span><span class="hljs-variable">$sessionId</span></span><span>]);
</span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$row</span></span><span> ? </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'session_data'</span></span><span>] : </span><span><span class="hljs-string">''</span></span><span>;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">write</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>, </span><span><span class="hljs-variable">$data</span></span><span>)
{
</span><span><span class="hljs-comment">// Sitzungsdaten aktualisieren</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->db-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"REPLACE INTO sessions (session_id, session_data, last_access) VALUES (:session_id, :session_data, :last_access)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([
</span><span><span class="hljs-string">'session_id'</span></span><span> => </span><span><span class="hljs-variable">$sessionId</span></span><span>,
</span><span><span class="hljs-string">'session_data'</span></span><span> => </span><span><span class="hljs-variable">$data</span></span><span>,
</span><span><span class="hljs-string">'last_access'</span></span><span> => </span><span><span class="hljs-title function_ invoke__">time</span></span><span>()
]);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">destroy</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$sessionId</span></span></span><span>)
{
</span><span><span class="hljs-comment">// Sitzungsdaten löschen</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->db-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM sessions WHERE session_id = :session_id"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'session_id'</span></span><span> => </span><span><span class="hljs-variable">$sessionId</span></span><span>]);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
</span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">gc</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$maxlifetime</span></span></span><span>)
{
</span><span><span class="hljs-comment">// Aufräumen abgelaufene Sitzungen aufräumen</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable language_">$this</span></span><span>->db-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM sessions WHERE last_access < :expire_time"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-string">'expire_time'</span></span><span> => </span><span><span class="hljs-title function_ invoke__">time</span></span><span>() - </span><span><span class="hljs-variable">$maxlifetime</span></span><span>]);
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}
}
</span></span>
In dieser Implementierung interagieren wir mit der Datenbank über PDO, und die spezifischen Vorgänge sind wie folgt:
Offene Methode: Initialisieren Sie die Datenbankverbindung, in der Regel wird die Datenbankverbindung in dieser Methode festgelegt.
Methode lesen : Fragen Sie die entsprechenden Sitzungsdaten aus der Datenbank über die Sitzungs -ID ab.
Schreiben Sie Methode: Schreiben Sie Sitzungsdaten in die Datenbank. Wenn die Sitzungs -ID nicht vorhanden ist, fügen Sie einen neuen Datensatz ein und aktualisieren Sie den vorhandenen Datensatz.
Methode zerstören : Daten mit der angegebenen Sitzungs -ID löschen.
GC -Methode: Führen Sie den Betrieb des Müllsammlung durch und löschen Sie abgelaufene Sitzungsunterlagen.
Nach Abschluss der Implementierung von SessionHandler müssen Sie einen benutzerdefinierten Sitzungsspeicherprozessor in PHP registrieren. Setzen Sie benutzerdefinierte Sitzungsverarbeitungsmethoden über Session_set_save_handler -Funktion.
<span><span><span class="hljs-comment">// Erstellen Sie eine Datenbankverbindung</span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=test'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-comment">// Sofortieren Sie einen benutzerdefinierten Sitzungsprozessor</span></span><span>
</span><span><span class="hljs-variable">$sessionHandler</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DbSessionHandler</span></span><span>(</span><span><span class="hljs-variable">$db</span></span><span>);
</span><span><span class="hljs-comment">// Registrieren Sie einen benutzerdefinierten Sitzungsprozessor</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_set_save_handler</span></span><span>(
[</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'open'</span></span><span>],
[</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'close'</span></span><span>],
[</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'read'</span></span><span>],
[</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'write'</span></span><span>],
[</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'destroy'</span></span><span>],
[</span><span><span class="hljs-variable">$sessionHandler</span></span><span>, </span><span><span class="hljs-string">'gc'</span></span><span>]
);
</span><span><span class="hljs-comment">// Starten Sie eine Sitzung</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_start</span></span><span>();
</span></span>
Hier ersetzt Session_set_save_handler die Sitzungsverarbeitungsmethode von PHP durch eine benutzerdefinierte DBSessionHandler -Klasse, sodass die Sitzungsdaten in der Datenbank gespeichert sind.
Um einen effizienten und stabilen Speicher für Datenbanksitzungen zu erzielen, sollte die folgenden Aspekte besondere Aufmerksamkeit geschenkt werden:
In der Sitzungstabelle wird das Feld Session_ID normalerweise als Hauptschlüssel verwendet, um sicherzustellen, dass es Einzigartigkeit und effiziente Abfrageleistung aufweist. Zusätzlich kann das Feld Last_access indexiert werden, um die effiziente Suche nach abgelaufenen Sitzungen während der Müllsammlung zu ermöglichen.
Die Strategie zur Sitzung der Sitzung ist der Schlüssel zur Gewährleistung effizienter Datenbanksitzungen. Indem Sie rational die maximale Lebenszeit der Sitzung ( maxlifetime ) festlegen und abgelaufene Sitzungen in der GC -Methode löschen, können Sie zu viele Junk -Daten in der Datenbank verhindern.
Da Sitzungsdaten gemeinsam genutzt werden, können mehrere Anfragen gleichzeitig auf die gleiche Sitzung zugreifen und dieselbe Sitzung ändern. Um Datenkonflikte und Inkonsistenzen zu vermeiden, kann eine Strategie für Sitzungssperrung angewendet werden, um sicherzustellen, dass andere Anforderungen nicht gleichzeitig während der Änderung der Sitzungsdaten geändert werden.
Bei hohen Anwendungen mit Parallelität kann das Erstellen einer Datenbankverbindung jedes Mal die Leistung direkt beeinflussen. Erwägen Sie, die Datenbankverbindungspooling -Technologie zu verwenden oder die Leistung zu verbessern, indem Datenbankverbindungen bestehen.
Um den Druck auf die Datenbank zu verringern, ist es möglich, Caching -Technologien wie Redis, Memcached usw. zu kombinieren, indem Sitzungsdaten in den Speicher zwischengespeichert werden. Dies verringert die Belastung der Datenbank und verbessert die Reaktionsgeschwindigkeit und Stabilität des Sitzungsspeichers.
Durch die Implementierung der SessionHandler -Schnittstelle und des Speicherns von Sitzungsdaten in der Datenbank kann die Flexibilität und Stabilität des Sitzungsmanagements effektiv verbessert werden. Durch rationales Entwerfen der Implementierungsmethode des Sitzungsspeichers und der Annahme geeigneter Optimierungsmaßnahmen kann ein effizientes, stabiles und skalierbares Datenbank -Sitzungsspeichersystem erreicht werden.