Domanda

Sto cercando di scrivere un persister di sessione personalizzato in PHP. Ma per qualche ragione viene chiamata solo la mia funzione di lettura della sessione, non la mia funzione di scrittura della sessione. Pertanto la sessione non è persistente. Se torno al gestore della sessione predefinito (file), tutto funziona. Se aggiungo session_write_close () alla fine dello script di test, tutto funziona. Ma il manuale di PHP afferma esplicitamente che non è necessario chiamare esplicitamente session_write_close () perché viene automaticamente chiamato alla fine dello script. E non voglio mettere session_write_close () in ogni possibile punto di uscita nella mia applicazione esistente!

Ecco del codice che illustra il problema. Lo sto eseguendo su WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. Il file di registro contiene solo voci per s_open () e 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(

Sto cercando di scrivere un persister di sessione personalizzato in PHP. Ma per qualche ragione viene chiamata solo la mia funzione di lettura della sessione, non la mia funzione di scrittura della sessione. Pertanto la sessione non è persistente. Se torno al gestore della sessione predefinito (file), tutto funziona. Se aggiungo session_write_close () alla fine dello script di test, tutto funziona. Ma il manuale di PHP afferma esplicitamente che non è necessario chiamare esplicitamente session_write_close () perché viene automaticamente chiamato alla fine dello script. E non voglio mettere session_write_close () in ogni possibile punto di uscita nella mia applicazione esistente!

Ecco del codice che illustra il problema. Lo sto eseguendo su WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. Il file di registro contiene solo voci per s_open () e s_read () .

<*>SESSION['time']) ) echo 'Session time: ' . date('Y-m-d h:i:s',

Sto cercando di scrivere un persister di sessione personalizzato in PHP. Ma per qualche ragione viene chiamata solo la mia funzione di lettura della sessione, non la mia funzione di scrittura della sessione. Pertanto la sessione non è persistente. Se torno al gestore della sessione predefinito (file), tutto funziona. Se aggiungo session_write_close () alla fine dello script di test, tutto funziona. Ma il manuale di PHP afferma esplicitamente che non è necessario chiamare esplicitamente session_write_close () perché viene automaticamente chiamato alla fine dello script. E non voglio mettere session_write_close () in ogni possibile punto di uscita nella mia applicazione esistente!

Ecco del codice che illustra il problema. Lo sto eseguendo su WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. Il file di registro contiene solo voci per s_open () e s_read () .

<*>SESSION['time']); else echo 'Session empty'; echo '<br>'; echo 'Session ID: ' . session_id();

Sto cercando di scrivere un persister di sessione personalizzato in PHP. Ma per qualche ragione viene chiamata solo la mia funzione di lettura della sessione, non la mia funzione di scrittura della sessione. Pertanto la sessione non è persistente. Se torno al gestore della sessione predefinito (file), tutto funziona. Se aggiungo session_write_close () alla fine dello script di test, tutto funziona. Ma il manuale di PHP afferma esplicitamente che non è necessario chiamare esplicitamente session_write_close () perché viene automaticamente chiamato alla fine dello script. E non voglio mettere session_write_close () in ogni possibile punto di uscita nella mia applicazione esistente!

Ecco del codice che illustra il problema. Lo sto eseguendo su WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. Il file di registro contiene solo voci per s_open () e s_read () .

<*>SESSION['time'] = time(); ?>
È stato utile?

Soluzione

Blargh! Sono stato sorpreso dall'avviso che PHP stesso aveva messo lì! Per citare il manuale:

  

Attenzione

     

La directory di lavoro corrente viene modificata con alcune SAPI se la sessione viene chiusa al termine dello script. È possibile chiudere la sessione in precedenza con session_write_close () .

Stava davvero cambiando e le chiamate a s_write () e s_close () erano registrate in un'altra directory!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top