Pregunta

Estoy tratando de escribir una sesión personalizada persistir en PHP. Pero por alguna razón solo se llama mi función de lectura de sesión, no mi función de escritura de sesión. Por lo tanto, la sesión no es persistente. Si vuelvo al controlador de sesión predeterminado (archivo), todo funciona. Si agrego session_write_close () al final del script de prueba, todo funciona. Pero el manual de PHP establece explícitamente que no es necesario llamar explícitamente a session_write_close () porque se llama automáticamente al final del script. ¡Y no quiero poner session_write_close () en cada punto de salida posible en mi aplicación existente!

Aquí hay un código que ilustra el problema. Lo estoy ejecutando en WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. El archivo de registro solo contiene entradas para s_open () y 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(

Estoy tratando de escribir una sesión personalizada persistir en PHP. Pero por alguna razón solo se llama mi función de lectura de sesión, no mi función de escritura de sesión. Por lo tanto, la sesión no es persistente. Si vuelvo al controlador de sesión predeterminado (archivo), todo funciona. Si agrego session_write_close () al final del script de prueba, todo funciona. Pero el manual de PHP establece explícitamente que no es necesario llamar explícitamente a session_write_close () porque se llama automáticamente al final del script. ¡Y no quiero poner session_write_close () en cada punto de salida posible en mi aplicación existente!

Aquí hay un código que ilustra el problema. Lo estoy ejecutando en WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. El archivo de registro solo contiene entradas para s_open () y s_read () .

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

Estoy tratando de escribir una sesión personalizada persistir en PHP. Pero por alguna razón solo se llama mi función de lectura de sesión, no mi función de escritura de sesión. Por lo tanto, la sesión no es persistente. Si vuelvo al controlador de sesión predeterminado (archivo), todo funciona. Si agrego session_write_close () al final del script de prueba, todo funciona. Pero el manual de PHP establece explícitamente que no es necesario llamar explícitamente a session_write_close () porque se llama automáticamente al final del script. ¡Y no quiero poner session_write_close () en cada punto de salida posible en mi aplicación existente!

Aquí hay un código que ilustra el problema. Lo estoy ejecutando en WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. El archivo de registro solo contiene entradas para s_open () y s_read () .

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

Estoy tratando de escribir una sesión personalizada persistir en PHP. Pero por alguna razón solo se llama mi función de lectura de sesión, no mi función de escritura de sesión. Por lo tanto, la sesión no es persistente. Si vuelvo al controlador de sesión predeterminado (archivo), todo funciona. Si agrego session_write_close () al final del script de prueba, todo funciona. Pero el manual de PHP establece explícitamente que no es necesario llamar explícitamente a session_write_close () porque se llama automáticamente al final del script. ¡Y no quiero poner session_write_close () en cada punto de salida posible en mi aplicación existente!

Aquí hay un código que ilustra el problema. Lo estoy ejecutando en WinXP SP3 + Apache 2.2.9 + PHP 5.2.6. El archivo de registro solo contiene entradas para s_open () y s_read () .

<*>SESSION['time'] = time(); ?>
¿Fue útil?

Solución

Blargh! ¡Me atraparon en un aviso que PHP mismo había puesto allí! Para citar el manual:

  

Advertencia

     

El directorio de trabajo actual se cambia con algunos SAPI si la sesión se cierra en la terminación del script. Es posible cerrar la sesión antes con session_write_close () .

Realmente estaba cambiando y las llamadas a s_write () y s_close () ¡se registraron en otro directorio!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top