Pergunta

Eu estou tentando escrever uma persister sessão personalizado em PHP. Mas por alguma razão só a minha sessão de ler functon está sendo chamado, não a minha função de sessão de gravação. Assim, a sessão não é mantido. Se eu voltar para o manipulador de sessão padrão (arquivo), tudo funciona. Se eu adicionar session_write_close() no final do script de teste - tudo funciona. Mas manual do PHP afirma explicitamente que você não precisa chamar explicitamente o session_write_close() porque é chamado automaticamente no final do script. E eu não quero colocar session_write_close () em cada possível ponto de saída no meu aplicativo existente!

Aqui está um código que ilustra o problema. Estou executando-o em WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. O arquivo de log contém apenas entradas para 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($_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();
?>
Foi útil?

Solução

Blargh! Foi pego em um aviso de que o PHP em si tinha colocado lá! Para citar o manual:

Aviso

Diretório de trabalho atual é alterado com algumas SAPIs se a sessão é fechada na rescisão script. É possível fechar a sessão anterior com session_write_close().

Foi realmente a mudar e as chamadas para s_write() e s_close() foram registrados em outro diretório!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top