Frage

Ich bin beim schreiben einer benutzerdefinierten session-persister in PHP.Aber aus irgendeinem Grund nur mein Sitzung Lesen functon wird immer aufgerufen, nicht meine session-write-Funktion.Damit die Sitzung nicht beibehalten.Wenn ich den Schalter wieder auf das Standard-session-handler (Datei), funktioniert alles.Wenn ich auf add session_write_close() am Ende der test-Skript, es funktioniert alles.Aber PHP-Handbuch erklärt ausdrücklich, dass Sie tun nicht müssen explizit aufgerufen werden die session_write_close() denn es wird automatisch aufgerufen, am Ende des Skripts.Und ich will nicht zu setzen session_write_close() an allen möglichen exit-Punkt in meine bestehende Anwendung!

Hier einige code, der veranschaulicht das problem.Ich bin es läuft unter WinXP SP3 + Apache 2.2.9 + PHP 5.2.6.Die log-Datei enthält immer nur Einträge für s_open() und s_read().

<?php
function logger($str)
{
    file_put_contents('session_log.txt', date('Y-m-d h:i:s') . " $str\r\n", FILE_APPEND);
}

function s_open()
{
    logger('s_open');
    return true;
}

function s_close()
{
    logger('s_close');
    return true;
}

function s_read()
{
    logger('s_read');
    return @file_get_contents('session.txt');
}
function s_write($id, $data)
{
    logger("s_write: $id - $data");
    file_put_contents('session.txt', $data);
    return true;
}

function s_destroy()
{
    logger('s_destroy');
    return true;
}

function s_gc()
{
    logger('s_gc');
    return true;
}

session_set_save_handler('s_open', 's_close', 's_read', 's_write', 's_destroy', 's_gc');

session_start();

if ( isset($_SESSION['time']) )
    echo 'Session time: ' . date('Y-m-d h:i:s', $_SESSION['time']);
else
    echo 'Session empty';
echo '<br>';    
echo 'Session ID: ' . session_id();


$_SESSION['time'] = time();
?>
War es hilfreich?

Lösung

Blargh!Gefangen auf einen Hinweis, dass PHP selbst hatte es!Zitat Handbuch:

Warnung

Das aktuelle Arbeitsverzeichnis geändert, mit einigen SAPIs, wenn die Sitzung geschlossen wird die Beendigung des Skripts.Es ist möglich, schließen Sie die Sitzung früher mit session_write_close().

Es war in der Tat ändern sich und die Aufrufe s_write() und s_close() protokolliert wurden, werden in einem anderen Verzeichnis!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top