2009-02-26 13 views
0

Kontext: Ich wollte app mit mod_rewrite erstellen (Front-Seite lädt untergeordnete Seiten), blieb aber beim Laden session_enabled Seiten von der Front-Controller-Seite stecken.zwei session_starts() hängen PHP-App

Problem: Das Problem ist, dass ich session_start() Aufruf Twise, PHP-Seite nicht mehr reagiert. Was seltsam ist, die Funktion session_start ist harmlos und wird auf verschiedenen Seiten aufgerufen.

child.php Datei:

parent.php Datei:

Anruf

Ich habe das Problem auf diese Probe verengt to parent.php wird den Browser unendlich laden. Sobald Sie einen der Aufrufe von session_start() kommentieren, wird sofort geladen.

Worin liegt die Ursache des Problems? Ich brauche dringend sessionfähige Seiten.

PS Ich kann es umgehen, indem Sie Seiten, aber sie verlassen sich auf URL-Parameter, ich möchte vermeiden, sie wegen irgendeiner Art von Parameter-Proxies zu beheben.

Antwort

1

Neben dieser nur eine Sitzung zu einem Zeitpunkt verwendet werden. Sie müssen die session_regenerate_id function rufen eine neue ID zu generieren:

if (session_id() != '') { 
    session_write_close(); 
} 
session_start(); 
session_regenerate_id(); 

sonst wird die Sitzungs-ID der Eltern würde auch für die Sitzung des Kindes verwendet werden.

5

Sie müssen session_write_close() anrufen, sobald Sie nicht mehr in die Sitzung schreiben müssen. Da beide Skripts die Sitzung für die gesamte Dauer geöffnet haben, können Sie nur jeweils eine Sitzung ausführen.

Von the manua l:

Session-Daten in der Regel nach Ihr Skript ohne Notwendigkeit beendet gespeichert session_write_close() zu nennen, aber als Sitzungsdaten zu gleichzeitige Schreiben verhindern gesperrt ist nur ein Skript arbeiten kann auf einer Sitzung bei jeder Zeit. Wenn Sie Framesets zusammen mit Sitzungen verwenden, werden Sie die Frames nacheinander durch diese Verriegelung laden. Sie können die Zeit reduzieren, die benötigt wird, um alle Frames zu laden, indem Sie die Sitzung beenden, sobald alle Änderungen an Sitzungsvariablen vorgenommen werden.

0

Mit zwei session_starts() in Ihrem Skript ist sowieso eine schlechte Sache.

Warum starten Sie die Sitzung nicht einfach in der Datei parent.php (und nicht in der Datei child.php)? Oder nur child.php und nicht parent.php

Es ist eine gute Idee, eine Seite zu haben, die von allen anderen Seiten enthalten ist, die alles initialisiert (SQL verbinden, Sitzungsstart, usw.). Und dann diese Seite in alle anderen aufnehmen.

1

Sie können auch überprüfen, ob eine Sitzung bereits gestartet ist und nur eine neue starten, wenn nicht:

if (!isset($_SESSION)) session_start(); 
+0

In diesem Fall wird die Sitzung nicht auf derselben Seite gestartet. – kmkaplan

+0

Es sieht aus wie die gleiche Seite, nur ein anderes Skript. Ich habe dies verwendet, um die gleiche Sitzung in einem Ajax-Include beim ersten Laden der Seite zu verwenden (wenn die Sitzung bereits gestartet wurde, im Gegensatz zum Ajax-Aufruf, wenn ich die Sitzung starten muss). – jeroen