Ich habe zuvor in einem Blog namens Magic Lab einen Artikel mit dem Titel „Gründliche Analyse der PHP-Sitzungsprinzipien“ gelesen. Der Autor erläuterte die Änderungen in jedem Link und die damit verbundenen Änderungen im Prozess der Codeausführung aus der Perspektive der Sitzungsnutzung. Parametereinstellungen und Funktionen. Ursprünglich wollte ich den ursprünglichen Artikel erneut veröffentlichen, aber der ursprüngliche Blog wurde geschlossen. Ich weiß nicht, ob das an dieser groß angelegten erneuten Einreichung oder einem anderen Grund liegt. Einige Originalinformationen wurden durch Baidu-Schnappschüsse gefunden. Die nicht gefundenen werden nach vorherigem Verständnis neu organisiert, damit jeder die Sitzung besser verstehen kann.
Wedge: Sitzungssprache
Sitzung, auf Englisch übersetzt als „Gespräch“, zwei Personen unterhalten sich, vom ersten Hallo-Satz bis zum letzten Abschiedssatz, dies stellt ein Gespräch dar. Die Sitzung bezieht sich in PHP hauptsächlich auf die Konversation zwischen dem Client-Browser und dem Datenaustausch zwischen dem Server, vom Öffnen des Browsers bis zum Schließen, dem einfachsten Sitzungszyklus. Wie implementieren Computersprachen im Allgemeinen Konversationen? Um ein beliebtes Beispiel zu nennen:
Der Kellner ist wie ein Friseurladen, und der Kunde ist wie jeder Kunde, der sich die Haare schneiden lässt. Viele Friseurläden haben diese Art der Werbemethode Holen Sie sich eine umsonst. Es gibt ungefähr drei Möglichkeiten, dies zu erreichen:
1. Der Friseur hat ein gutes Gedächtnis. Er wird auf einen Blick wissen, wie oft Sie hier waren – das nennt man das Protokoll selbst.
2. Jeder Gast erhält eine Mitgliedskarte, und Sie können diese Karte bei jedem Einkauf mitbringen. Jeder Einkauf wird erfasst und natürlich mit einem Siegel versehen – dies wird als Sitzungsrealisierung bezeichnet durch Cookies. Der Nachteil ist, dass ich die Mitgliedskarte oder das offizielle Siegel nicht vollständig fälschen kann Persönliche Informationen oder sogar ein Passwort: Wenn jeder Kunde kommt, um einen Einkauf zu tätigen, gibt er seine Mitgliedsnummer an und zeichnet dann die Anzahl der Einkäufe im großen Kontobuch auf. Dies ist die Sitzungsimplementierung im Kopf des Gastes ist die auf dem Client gespeicherte SESSIONID und das große Hauptbuch sind die auf dem Server gespeicherten Sitzungsdaten. Im Vergleich zur zweiten Methode ist die Sicherheit viel höher, es sei denn, Sie sagen, dass Sie Ihre Mitgliedsnummer und Ihr Passwort verlieren Fälschen der SESSIONID des Kunden.
Da das http-Protokoll zustandslos ist, kann PHP Sitzungen nur über die beiden letztgenannten Methoden implementieren. Das erstere Cookie weist die bereits erwähnten Nachteile auf und ist nicht sehr sicher, sodass wichtige Sitzungen die Verwendung von Sitzungen bevorzugen. Die Sitzung muss auf einer Kennung basieren, die auch als Passwort verstanden werden kann, nämlich SESSIONID. Dies ist eine verschlüsselte Zeichenfolge, die auf dem Client gespeichert wird, normalerweise in einem Cookie. Jede Kommunikation zwischen dem Client und dem Server erfolgt über diese SESSIONID. Der Client meldet zuerst seine Heimatadresse, und dann kann der Server die darauf gespeicherten Sitzungsdaten finden Setzen Sie den Anruf fort.
Allgemeine Sitzungseinstellungen in php.ini
[Server]
session.save_handler = files
Der Standardwert ist file, der definiert, wie die Sitzung auf dem Server gespeichert wird bedeutet, die Sitzung auf dem Server zu speichern. Wenn wir andere Möglichkeiten zum Speichern anpassen möchten (z. B. die Verwendung einer Datenbank), müssen wir dieses Element auf
session.save_path festlegen = "/tmp/"
Definition Der Speicherort, an dem der Server temporäre Dateien für Sitzungen speichert.
session.auto_start = 0
Wenn auf 1 gesetzt, ist es nicht erforderlich, session_start() in jede Datei zu schreiben, die automatisch gestartet wird.
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440
Diese drei Konfigurationen bilden zusammen den Garbage-Collection-Mechanismus der serverseitigen Sitzung session.gc_probability und session.gc_divisor Es stellt die Wahrscheinlichkeit der Sitzungsbereinigung dar. Die theoretische Erklärung besteht darin, dass der Server eine bestimmte Wahrscheinlichkeit hat, die Sitzung regelmäßig zu bereinigen: gc_probability/gc_divisor Dies bedeutet, dass bei der Initialisierung jeder neuen Sitzung eine Wahrscheinlichkeit von 1 % besteht, dass das Garbage Collection-Programm gestartet wird, und der Reinigungsstandard die durch session.gc_maxlifetime definierte Zeit ist.
[Client]
session.use_cookies = 1
Die von der Sitzungs-ID auf dem Client verwendete Speichermethode bedeutet, dass gleichzeitig die Sitzungs-ID des Clients verwendet wird wird $ in der Variablen $_COOKIE sein. Das Element _COOKIE['PHPSESSIONID'] existiert
session.use_only_cookies = 1
definiert auch die Speichermethode, die nur von der Sitzungs-ID verwendet wird Verwendung von Cookies zur Speicherung der Sitzungs-ID. Im Allgemeinen unterstützen Clients jetzt Cookies. Daher wird empfohlen, den Wert auf 1 zu setzen, um Angriffe im Zusammenhang mit der Weitergabe von Sitzungs-IDs über URLs zu verhindern.
session.use_trans_sid = 0
Entspricht der Einstellung oben auf 1, bedeutet dies, dass die Sitzungs-ID über den URL-Parameter übergeben werden darf 0;
session .referer_check =
Diese Einstellung wird nur wirksam, wenn session.use_trans_sid = 1. Der Zweck besteht darin, den „Referer“ im HTTP-Header zu überprüfen, um festzustellen, ob die Sitzungs-ID in der enthalten ist Die URL ist gültig. HTTP_REFERER muss die durch diesen Parameter angegebenen Zeichen enthalten, andernfalls wird die Sitzungs-ID in der URL als ungültig betrachtet. Daher ist der Standardwert normalerweise leer, dh es erfolgt keine Überprüfung.
session.name = PHPSESSID
Definieren Sie den Namen der Sitzungs-ID, dh den Variablennamen, der über das Browser-HTTP-Tool
session.hash_function = angezeigt werden kann 0
Wählen Sie die Verschlüsselungsmethode von session_name aus, 0 steht für MD5-Verschlüsselung, 1 steht für SHA1-Verschlüsselung, der Standardwert ist 0, aber es wird gesagt, dass die Verschlüsselung mit der SHA1-Methode sicherer ist
session.hash_bits_per_character = 4
Geben Sie an das Zeichen in session_name Wie viele Binärziffern in jedem Zeichen in der Zeichenfolge gespeichert sind. Diese Binärziffern sind die Ergebnisse der Hash-Funktion.
4 Bits: 0-9, a-f
5 Bits: 0-9, a-v
6 Bits: 0-9, a-z, A-Z, "-", ","
url_rewriter .tags = "a=href,area=href,frame=src,input=src,form=,fieldset="
Geben Sie an, welche HTML-Tags neu geschrieben werden sollen, um sid(session_id) einzuschließen (nur geöffnet in „session.use_trans_sid“) gültig) fügt der URL-Rewriter ein verstecktes „“ hinzu, das zusätzliche Informationen enthält, die an die URL angehängt werden sollen.
session.cookie_lifetime = 0
Der Lebenszyklus der Cookie-Datei, die die Sitzungs-ID speichert, bedeutet, dass die Sitzung beendet ist und die Sitzungs-ID automatisch verschwindet Zum Schließen geht die letzte verloren. session.cookie_path = /
Speichern Sie den Speicherort der session.cookie_domain = /
Speichern Sie die Domänennamen-Einstellung des Sitzungs-ID-Cookies. Sie hängt mit der Zugriffsberechtigungseinstellung des Domänennamens zusammen, die von Cookies zugelassen wird. Im Allgemeinen gilt, wenn Sie möchten, dass alle Verzeichnisse Ihrer Website darauf zugreifen können Wenn Sie mehr über die Cookies des Clients erfahren möchten, können Sie sich den Domänenparameter
session.bug_compat_42 = 1session.bug_compat_warn = 1
Diese beiden Einstellungen gelten als fast aufgegeben und dienen hauptsächlich der Funktion „session_register“, da „register_global“ von PHP5 standardmäßig geschlossen ist, ebenso wie die Funktion „session_register“. wird in PHP5 überhaupt nicht verwendet; und PHP6 wird diese Einstellung abschaffen und sie direkt als geschlossen definieren, daher besteht keine Notwendigkeit, diese beiden zu studieren.
Was macht session_start()?
Angenommen, dass mehrere Schlüsselparameter der Sitzung in php.ini wie folgt konfiguriert sind:
session.save_handler = files
session.use_cookies = 1
session.name = PHPSESSID
session .save_path = "/tmp/"
Im Folgenden werden Codebeispiele verwendet, um die Rolle von session_start während einer Sitzung zu veranschaulichen.
session_start();
$_SESSION['uname'] = 'monkey';
$_SESSION['ukey'] = 20119999 ;
?>
Nachdem Programm 1 ausgeführt wurde, führt session_start() zwei Dinge aus:
Öffnen Sie die Datei „sess_85891d6a81ab13965d349bde29b2306c“ mit einem Editor und Sie sehen eine Inhaltszeichenfolge wie „uname|s:6:“monkey“;ukey|i:20119999;“. In dieser Datei wird der spezifische Inhalt der Variablen $_SESSION gespeichert. Jede Variable wird durch ein „;“ getrennt.
Das Format ist: Variablenname |. Variablentyp: [Länge]: Wert; Zum Beispiel bedeutet: uname|s:6:"monkey"; Die Wertlänge ist 6, der Wert ist Monkey.
Dann stellt sich die Frage: Sind die beiden oben genannten Dinge abgeschlossen, wenn das Programm mit session_start() ausgeführt wird? Wer kommt zwischen diesen beiden Dingen zuerst und wer kommt zuletzt?
Programm 2:
session_start();
$_SESSION['uname'] = 'monkey ' ;
$_SESSION['ukey'] = 20119999;
sleep(30);
Löschen Sie zuerst alle Sitzungsdaten auf dem Client und dem Server Führen Sie dann Programm 2 aus, nutzen Sie die 30 Sekunden Ruhezeit im Programm, um den Sitzungsstatus von Client und Server zu überprüfen, und stellen Sie fest, dass: Während der Ausführung des Programms hat der Client keine Cookie-Datei zum Speichern der PHPSESSID erstellt , aber der Server hat sie bereits gespeichert, aber die Datei enthält keinen Inhalt. Nach 30 Sekunden wird die Cookie-Datei des Clients generiert und die Sitzungsdatei des Servers enthält.
Daraus lässt sich schließen, dass der allgemeine Prozess wie folgt aussehen sollte: Wenn das Programm session_start() ausführt, generiert der Server zuerst PHPSESSID und die entsprechende Sitzungsdatei, aber wenn das Programm $_SESSION zuweist, gibt es kein Schreiben Nehmen wir an, dass der entsprechende Wert in der Sitzungsdatei gespeichert ist. Nachdem das Programm ausgeführt wurde, wird die Cookie-Datei, die die PHPSESSID speichert, auf dem Client generiert und der Wert in der Variablen $_SESSION wird auf den Server geschrieben Was die letzten beiden Schritte betrifft, die zuerst kommen, habe ich in der Sitzungsdatei noch keine gute Möglichkeit gefunden, dies zu beweisen.
Zur weiteren Demonstration löschen Sie den sitzungsbezogenen Inhalt auf dem Client und dem Server, führen Sie Programm 3 aus und beobachten Sie die Ergebnisse des ersten und zweiten Mals:
Programm 3:
php
session_start();
$_SESSION['uname'] = 'monkey';
$session_id = session_id(
$sess_file = "/tmp/sess_". $session_id;
$content = file_get_contents($sess_file);
echo '***'.$_COOKIE['PHPSESSID'] .'***';
echo '
' . $_SESSION['uname'] '
echo '***'.'***';
Das Obige ist die Ausführungsmethode des ersten session_start(), das heißt, was getan wird, wenn der erste session_start() in einer Reihe von Programmen erscheint. Schauen wir uns den nachfolgenden session_start() an:
Angenommene php.ini-Konfiguration: session.cookie_lifetime = 0
Programm 4:
session_start();
echo $_SESSION['uname'] ;
echo $_SESSION['ukey'];
?> Sitzungsinhalt, führen Sie das Programm 4 aus. Der normale Inhalt wird gedruckt. Was wird zu diesem Zeitpunkt passieren, wenn Sie den Browser gewaltsam schließen und dann Programm 4 ausführen?
Zuerst wird session.cookie_lifetime auf 0 gesetzt, was bedeutet, dass die Lebensdauer der vom Client mit PHPSESSID gespeicherten Cookie-Datei 0 ist. Wenn der Browser eingeschaltet ist, beträgt der Wert von PHPSESSID wird im Speicher gespeichert. Sobald es gewaltsam geschlossen wird, wird gleichzeitig die Cookie-Datei, die PHPSESSID speichert, zerstört, aber der Server führt session_destroy() nicht aus, sodass die Sitzungsdatendatei auf dem Server immer noch vorhanden ist. aber wenn der Browser das Ausführungsprogramm 4 erneut öffnet, wird nichts ausgegeben. Aus dieser Überlegung:
Um den Mechanismus zu realisieren, dass sich derselbe Benutzer nur von einem Computer oder sogar einem Browser aus anmelden kann, erzwingen einige Systeme daher das Schließen des Browsers, wenn die Einstellung session.cookie_lifetime nicht geändert wird Wenn sich der Benutzer nicht anmelden kann, bevor die serverseitige Sitzungslebensdauer abläuft, ist es besser, session.cookie_lifetime auf einen relativ großen Wert zu setzen. Dies hat jedoch keine Auswirkung, wenn eine Cookie-Datei länger vorhanden ist.