2009-07-05 5 views
2

Ich muss eine php4-Anwendung migrieren, die session_set_save_handler() zu php5 verwendet.Seltsames Verhalten Migration von Sitzungen mit Rückrufen von PHP4 nach PHP5

In php4 war alles in Ordnung, aber in php5 können die Callback-Funktionen nicht mehr auf die globalen Variablen zugreifen, die auf der Seite gesetzt wurden, bevor session_set_save_handler() aufgerufen wurde.

Im Beispiel unter dem globalen g1 var $ nicht in den session_writer() zugegriffen werden (die als Callback-Funktion übergeben wird)

Gibt es eine Erklärung für dieses Verhalten oder können Sie einen Hinweis geben auf Sitzungen mit Rückrufen Migration von PHP4 bis 5?

Dies ist der Pseudocode:

function session_writer($id,$vars) { 
    global $g1; 
    echo "g1 not defined here: ".is_object($g1); 
} 

global $g1; 
$g1 = SomeObject(); //which is the DB connection for the session writer 

session_set_save_handler($o,$c,$r,"session_writer",$d,$g); 
session_start(); 

Antwort

3

Das tatsächlich in der documentation vermerkt ist:

Ab PHP 5.0.5 werden die Schreib- und schließen Handler nach Objekt Zerstörung genannt und kann daher nicht Verwenden Sie Objekte oder werfen Sie Ausnahmen. Die Objektdestruktoren können jedoch Sitzungen verwenden.

Es ist möglich, session_write_close() vom Zerstörer zu rufen, um dieses Huhn- und Eiproblem zu lösen.

Im Wesentlichen werden Sie session_write_close() vom destructor Ihrer SomeObject oder alternativ zu nennen haben, gehen Sie wie folgt vor:

<?php register_shutdown_function("session_write_close"); ?> 

Entweder von diesen Lösungen sollen das Schreiben und Schließen der Sitzung erzwingen vor Alle Objekte werden zerstört, so dass Sie Ihre ursprüngliche Callback-Funktion beibehalten können.

+0

Danke, ich beginne zu erfassen, was hier passiert. SomeObject() ist meine Datenbank. Also könnte ich die Erstellung des DB-Objekts auf die session_writer selbst umgestalten und kopieren, das wäre am einfachsten? – user89021

+0

Nein, sie können überhaupt keine Objekte verwenden, außer Sie erzwingen das Schreiben der Sitzung * bevor * die Objekte zerstört werden. Wie ich schon sagte, sollten Sie session_write_close() von einem Objektdestruktor aufrufen ODER als shutdown-Funktion registrieren. – molf

0

Molfs Antwort identifiziert das Problem. Hier sind einige weitere Informationen:

session_write_close() nimmt als Eingabe eine Kennung und die damit verbundenen Daten. Wenn Sie nur minimale Änderungen vornehmen, müssen Sie wahrscheinlich wissen, dass die Daten von session_encode() zurückgegeben werden (eine Zeichenfolge, die den Inhalt des Arrays $ _SESSION codiert). Die ID ist, was von session_id() zurückgegeben wird.