2009-03-31 12 views
6

Cada vez que accedo a datos en $ _SESSION, ¿Actualiza inmediatamente el archivo de sesión en el disco, o solo una vez cuando el proceso deja de funcionar? ¿O cada n bytes de datos cambian (sonrojan)?

Esta pregunta no es necesariamente sobre el controlador de sesión de archivo específico, sino sobre cada controlador. (¿Cada toque en sesión invoca inmediatamente una E/S de cualquier tipo, además del almacenamiento de una variable normal en la memoria).

Respuesta

3

Como escribió Matt, escribe al final de la ejecución del script de forma predeterminada. Usted puede leer sobre ello aquí en session_write_close()

sesión de datos normalmente se almacena después su guión terminado sin la necesidad de llamar session_write_close(), sino como datos de sesión está bloqueada a evitar escrituras concurrentes único guión puede operar en una sesión en cualquier momento . Al usar conjuntos de marcos juntos con sesiones experimentará la carga de los cuadros uno por uno debido a este bloqueo . Puede reducir el tiempo necesario para cargar todos los marcos por finalizando la sesión tan pronto como se realicen todos los cambios en las variables de sesión.

0

Depende del controlador. Puede escribir su propio controlador para asegurarse de que solo se produzca con la frecuencia que desee si quiere estar absolutamente seguro del comportamiento. Hay 6 devoluciones de llamada usadas para gestionar las variables de sesión. El llamado "escribir" no tiene que realizar ninguna E/S real y escribir el archivo de la sesión podría esperar hasta que la llamada se "cierre". Es un detalle de implementación que, como dije, depende del manejador.

+0

Supongamos que se cuelga el proceso, supongo que los datos de sesión no escritos se pierden, ¿correcto? –

+0

Sí, y presumiblemente cualquier acción de base de datos no confirmada también se pierde. – jmucchiello

2

Lo escribe y el final del proceso en mi configuración. Hice un nuevo _ session_ write_method:

public function _session_write_method($id, $sess_data) { 
    var_dump(file_put_contents('/var/www/public_html/testing.txt', serialize($sess_data))); 
    return(true); 
} 

y luego:

$_SESSION['foo'] = 'bar'; 
while(true) 

ejecuté el guión, esperé unos segundos y luego corrí 'matar sudo' en el identificador de proceso. No escribió los datos serializados en el archivo. Lo ejecuté de nuevo sin el bucle infinito y obtuve: int (22) en la parte inferior de la página y testing.txt se escribió y contenía con éxito: s: 14: "foo | s: 3:" bar ";" ;

Cuestiones relacionadas