Chrome erstellt doppelte Sitzungen mit derselben ID

Bei der heutigen Überarbeitung meiner Sitzungsbibliothek ist ein Problem aufgetreten. Möglicherweise habe ich zum ersten Mal ein browserspezifisches Problem in einem Back-End-Skript festgestellt. Ich hoffe, jemand kann Licht ins Dunkel bringen.

Grundsätzlich funktioniert die Sitzungsbibliothek wie folgt: Wenn sie instanziiert wird, sucht sie auf dem Client-Computer nach einem Cookie namens 'id' (in Form eines eindeutigen Ergebnisses). Wenn ein Cookie gefunden wird, überprüft das Skript dies und vergleicht eine Hash-Kopie der Benutzeragentenzeichenfolge mit Einträgen in einer Sitzungstabelle. Wenn ein passender Eintrag gefunden wird, setzt das Skript die Sitzung fort. Wenn kein Cookie mit dem Namen 'id' gefunden wird oder kein passender Eintrag in der Sitzungstabelle vorhanden ist, erstellt das Skript beide. Ziemlich normal, denke ich.

Hier ist der seltsame Teil: In Firefox funktioniert alles wie vorhergesagt. Der Benutzer erhält eine Sitzung, die er nach dem Herstellen der Verbindung immer wieder aufnimmt, solange noch keine 24 Stunden Inaktivität verstrichen sind. Wenn ich jedoch die Seite in Chrome besuche, werden in der Sitzungstabelle zwei Einträge angezeigt, obwohl sie gleich aussieht und Abfragen in derselben Reihenfolge auszuführen scheint. Die Sitzungen haben eine Agentenzeichenfolge gemeinsam, aber die IDs sind unterschiedlich. Zeitstempelprotokolle zeigen an, dass die Ghost-Sitzung kurz (innerhalb einer Sekunde) nach der für den Benutzer erstellten Sitzung erstellt wird.

Zu Debugging-Zwecken habe ich während der Ausführung Abfragen auf dem Bildschirm gedruckt. Dies ist ein Beispiel für das, was ich sehe, wenn Chrome eine Sitzung öffnen soll und stattdessen zwei Sitzungen öffnen soll:

// Attempting to resume a session
SELECT id FROM sessions WHERE id = '4fd24a5cd8df12.62439982' AND agent = '9bcd5c6aac911f8bcd938a9563bc4eca'

// No result, so it creates a new one
INSERT INTO sessions (id, agent, start, last) VALUES ('4fd24ef0347f26.72354606', '9bcd5c6aac911f8bcd938a9563bc4eca', '1339182832', '1339182832')

// Clear old sessions
DELETE FROM sessions WHERE last < 1339096432

Und hier ist, was ich später in der Datenbank sehe:

id, agent, start, last
4fd24ef0347f26.72354606, 9bcd5c6aac911f8bcd938a9563bc4eca, 1339182832, 1339182832
4fd24ef0857f94.72251285, 9bcd5c6aac911f8bcd938a9563bc4eca, 1339182833, 1339182833

Vermisse ich etwas Offensichtliches? Das einzige, was mir einfällt, ist, dass Chrome möglicherweise eine versteckte Sitzung im Hintergrund erstellt, um möglicherweise die Seite zu crawlen. Wenn dies jedoch der Fall ist, könnte es später zu einem Problem werden, wenn ich aktive Sitzungen mit Einträgen in der Benutzertabelle verknüpfe. Ich habe in meinem Skript nach möglichen Fehlern gesucht, aber bisher noch nichts gefunden, und in Firefox funktioniert alles wie erwartet.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage