2009-03-31 14 views
6

Ogni volta che accedo ai dati in $ _SESSION, aggiorna immediatamente il file di sessione sul disco o solo una volta quando il processo si interrompe? O ogni n byte di dati modificati (a filo)?

Questa domanda non riguarda necessariamente il gestore di sessione di file specifico, ma ogni gestore. (Ogni tocco in sessione richiama immediatamente un I/O di qualsiasi tipo, oltre alla memorizzazione di una variabile normale in memoria).

risposta

3

Come scritto da Matt, scrive alla fine dell'esecuzione dello script per impostazione predefinita. Si può leggere su qui in session_write_close()

sessione tecnica è di solito memorizzato dopo lo script terminato senza la bisogno di chiamare session_write_close(), ma come dati di sessione è bloccata a prevenire scritture contemporanee solo uno sceneggiatura può operare su una sessione in qualsiasi momento . Quando si utilizzano i set di cornici insieme a con le sessioni, i blocchi si caricano uno a uno a causa di questo blocco . È possibile ridurre il tempo necessario per caricare tutti i telegrammi entro il terminando la sessione non appena tutte le modifiche di alle variabili di sessione sono state eseguite.

0

Dipende dal gestore. Puoi scrivere il tuo gestore per assicurarti che accada solo tutte le volte che vuoi, se vuoi essere assolutamente sicuro del comportamento. Sono disponibili 6 callback per gestire le variabili di sessione. Quello chiamato "write" non deve eseguire alcun I/O reale e la scrittura del file di sessione potrebbe attendere fino alla chiamata "close". È un dettaglio di implementazione che, come ho detto, dipende dal gestore.

+0

Dire il crash del processo, presumo che i dati della sessione non scritta siano andati persi, corretto? –

+0

Sì, e presumibilmente tutte le azioni del database non salvate vengono perse. – jmucchiello

2

Lo scrive e la fine del processo sul mio setup. Ho fatto un nuovo _ 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); 
} 

e poi:

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

ho eseguito lo script, attese qualche secondo e poi corse 'sudo kill' sul processo di id. Non ha scritto i dati serializzati nel file. L'ho eseguito di nuovo senza il ciclo infinito e ho ottenuto: int (22) nella parte inferiore della pagina e testing.txt è stato scritto e contenuto correttamente: s: 14: "foo | s: 3:" bar ";" ;

Problemi correlati