Die Sitzungsverwaltung von PHP ist ein sehr wichtiger Bestandteil der Webentwicklung und bietet Entwicklern die Möglichkeit, Benutzersitzungsdaten zu speichern und zu verwalten. Standardmäßig verwendet PHP Dateien zum Speichern von Sitzungsdaten. In einigen Fällen möchten Entwickler jedoch möglicherweise Sitzungsdaten wie Datenbanken, Cache -Systeme usw. speichern, um diesen benutzerdefinierten Speichermechanismus zu implementieren. PHP bietet der SessionIDInterface -Schnittstelle und ermöglicht es uns, die Art und Weise, wie die Sitzungen gespeichert werden, flexibel zu steuern.
SessionIDInterface ist eine Schnittstelle, die in PHP Version 7.4 eingeführt wird und die Möglichkeit bietet, Entwicklern den ID -Generierung und den Speichermechanismus von Sitzungen anzupassen. Im Allgemeinen wird die ID einer PHP -Sitzung automatisch intern von PHP generiert und in $ _Session gespeichert. Durch die Implementierung von SessionIDInterface können Entwickler die Akquisitions- und Speichermethoden von Sitzungs -IDs anpassen.
Insbesondere bietet SessionIDInterface zwei Hauptmethoden:
GetSessionId () : Wird verwendet, um die ID der aktuellen Sitzung zu erhalten.
setSessionId (String $ id) : Wird verwendet, um die Sitzungs -ID festzulegen.
Durch die Implementierung dieser beiden Methoden können Entwickler steuern, wie die Sitzungs -ID generiert, gespeichert und aus dem Speicher gelesen wird.
Um den Standard -Sitzungsspeichermechanismus zu ändern, müssen wir eine benutzerdefinierte Sitzungshandlungsklasse implementieren, mit der SessionHandlerInterface implementiert und SessionIDInterface kombiniert wird, um eine neue Speichermethode bereitzustellen. Hier ist ein einfaches Beispiel, das zeigt, wie eine Datenbank zum Speichern von Sitzungsdaten verwendet wird:
Zunächst müssen wir eine Klasse erstellen, die SessionHandlerInterface und SessionIDInterface implementiert. Diese Klasse wird verwendet, um den Speicher und Erwerb von Sitzungsdaten zu verarbeiten.
<span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">DatabaseSessionHandler</span></span><span> </span><span><span class="hljs-keyword">implements</span></span><span> </span><span><span class="hljs-title">SessionHandlerInterface</span></span><span>, </span><span><span class="hljs-title">SessionIdInterface</span></span><span>
{
</span><span><span class="hljs-keyword">private</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">$dbConnection</span></span></span><span>)
{
</span><span><span class="hljs-variable language_">$this</span></span><span>->db = </span><span><span class="hljs-variable">$dbConnection</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">// Hier können Sie Datenbankverbindungsüberprüfung und andere Vorgänge 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">// Schließen Sie die Datenbankverbindung</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">$query</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-variable language_">$this</span></span><span>->db-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</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">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetchColumn</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">$sessionData</span></span><span>)
{
</span><span><span class="hljs-comment">// Schreiben Sie Sitzungsdaten in die Datenbank</span></span><span>
</span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"REPLACE INTO sessions (session_id, session_data) VALUES (:session_id, :session_data)"</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-variable">$query</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</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">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':session_data'</span></span><span>, </span><span><span class="hljs-variable">$sessionData</span></span><span>);
</span><span><span class="hljs-keyword">return</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-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 in der Datenbank löschen</span></span><span>
</span><span><span class="hljs-variable">$query</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-variable language_">$this</span></span><span>->db-></span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</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">$query</span></span><span> = </span><span><span class="hljs-string">"DELETE FROM sessions WHERE last_access < :maxlifetime"</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-variable">$query</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':maxlifetime'</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-variable">$stmt</span></span><span>-></span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();
}
</span><span><span class="hljs-comment">// erreichen SessionIdInterface Schnittstellenmethode</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">getSessionId</span></span><span>(</span><span><span class="hljs-params"></span></span><span>)
{
</span><span><span class="hljs-comment">// Benutzerdefinierte Zugriff Session ID Weg</span></span><span>
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">session_id</span></span><span>(); </span><span><span class="hljs-comment">// Oder benutzerdefinierte Logikgenerierung ID</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">setSessionId</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$id</span></span></span><span>)
{
</span><span><span class="hljs-comment">// Benutzerdefinierte Einstellungen Session ID Weg</span></span><span>
</span><span><span class="hljs-title function_ invoke__">session_id</span></span><span>(</span><span><span class="hljs-variable">$id</span></span><span>); </span><span><span class="hljs-comment">// Oder benutzerdefinierte Logik speichern ID</span></span><span>
}
}
</span></span>
In PHP müssen wir einen benutzerdefinierten Sitzungsprozessor über die Funktion Session_set_Save_handler () registrieren. Auf diese Weise verwendet PHP unsere benutzerdefinierten Klassen, um die Speicherung und das Lesen von Sitzungen zu verarbeiten.
<span><span><span class="hljs-comment">// Annahmen $dbConnection Es ist effektiv PDO Datenbankverbindungsobjekt</span></span><span>
</span><span><span class="hljs-variable">$handler</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">DatabaseSessionHandler</span></span><span>(</span><span><span class="hljs-variable">$dbConnection</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">$handler</span></span><span>, </span><span><span class="hljs-string">'open'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'close'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'read'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'write'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</span></span><span>, </span><span><span class="hljs-string">'destroy'</span></span><span>],
[</span><span><span class="hljs-variable">$handler</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>
Jetzt werden PHP -Sitzungsdaten in der Datenbank anstelle des Standarddateisystems gespeichert. Sie können die $ _Session -Variable wie gewohnt verwenden, um auf Sitzungsdaten zuzugreifen:
<span><span><span class="hljs-comment">// Setzen Sie Sitzungsdaten</span></span><span>
</span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>] = </span><span><span class="hljs-string">'John Doe'</span></span><span>;
</span><span><span class="hljs-comment">// Sitzungsdaten abrufen</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user'</span></span><span>]; </span><span><span class="hljs-comment">// Ausgabe John Doe</span></span><span>
</span></span>
Durch die Implementierung der SessionIDInterface- und SessionHandlerInterface -Schnittstellen können Entwickler den Sitzungsspeichermechanismus von PHP flexibel anpassen und sich nicht mehr auf das Dateisystem oder die Standardspeichermethode des PHP verlassen. Unabhängig davon, ob in einer Datenbank oder in einem Cache -System gespeichert ist, kann das Metro -Sitzungsmanagement effizienter und flexibler sein. Gleichzeitig verbessert dies auch die Skalierbarkeit des Systems und kann sich an verschiedene Anwendungsszenarien anpassen.
Durch das Anpassen der Sitzungsspeichermethode können Sie nicht nur den Standort der Sitzungsdatenspeicherung steuern, sondern auch eine stärkere Kontrolle über die Generation, Speicherung und Lesen von Sitzungs -IDs bieten, wodurch komplexere Geschäftsanforderungen erfüllt werden.