2016-01-29 16 views
6

Ho uno strano problema con un'applicazione Laravel 5.1.Laravel 5.1 dati sessione in modo casuale

Intermittently, sta lasciando cadere i dati di sessione. Mi viene rilevato scrivendo un middleware che scrive il contenuto della sessione per quella richiesta nel file di registro. Sebbene l'ID sessione (Session::getId()) non cambi, il valore di _token nei dati di sessione recuperati con Session::all()fa.

Come ho detto, questo accade a intermittenza. Posso aggiornare lo stesso URL più volte, quindi a caso su un aggiornamento i dati della sessione sono andati, e il valore _token è diverso dalle richieste precedenti.

Cosa potrebbe causare questo? Ho anche notato che l'oggetto flash non è nei dati della sessione "abbandonata".

Di seguito è riportato uno snippet del registro. È possibile visualizzare il contenuto della chiave session_data in modo casuale "forma" nelle ultime due righe, ma l'ID di sessione rimane costante.

Inoltre, non sono sicuro se è pertinente, ma ho DebugBar attivato.

Screen-shot

UPDATE: Attraverso il debug, ho scoperto che su qualche pagina carica la sessione è completamente vuota , come in, non _token (quindi uno nuovo sempre generato). Niente.

+0

Quanto frequentemente accade? Perché ho cercato di riprodurlo abilitando DebugBar, creando un middleware che registri l'ID di sessione e i dati come JSON serializzati proprio come si fa, quindi chiamò una route con una vista che si aggiorna automaticamente ogni secondo e la lascia come quella per circa 10 minuti. Ma non ha aggiornato il token CSRF o non ha rilasciato alcun dato di sessione.Questo è stato fatto con 'artisan serve' e il driver di sessione' file', quindi potresti voler pubblicare maggiori informazioni sul tuo ambiente. – Bogdan

+0

Succede ogni minuto o due. L'app è in esecuzione con Apache. Posso aggiornare un URL e casualmente perderò i dati secondo la schermata dopo un certo numero di aggiornamenti. Non c'è un vero e proprio schema, che sta cercando di trovare la causa difficile. –

+0

Il mio primo suggerimento è di provare a riprodurre il problema usando su un'installazione pulita di Laravel qualcosa sulla falsariga di ciò che ho descritto nel mio primo commento, per vedere almeno se il problema è con il codice dell'applicazione o con qualcos'altro in la tua configurazione. – Bogdan

risposta

0

Se si utilizza Linux, provare a utilizzare Redis (http://redis.io) come gestore di sessione/cache in laravel. Ho avuto alcuni problemi in passato con testo/cookie e laravel in alcuni server. Quando ho installato Redis, non ho più avuto problemi.

Maggiori informazioni: https://laravel.com/docs/5.1/redis

+0

Grazie, ma un driver alternativo non risolve il problema. Il nostro ambiente di staging sta utilizzando il driver di file, e questo dove si verifica il problema. –

+0

Puoi provare il driver del database? Si manterrà invece in una tabella di database, forse funziona. https://laravel.com/docs/5.1/session –

2
  1. Se si sta usando il driver di file, si potrebbe incorrere in condizioni di gara su richieste simultanee. Il file viene quindi troncato, Laravel non può leggerlo, quindi aggiorna la sessione. Le condizioni di gara possono anche portare a un sintomo in cui qualcosa che stai mettendo in sessione non viene messo. Questo tende ad essere casuale, quindi è molto difficile eseguire il debug. Secondo il team di Laravel, si tratta di una limitazione nota del driver di file e non sembra essersi sistemata, quindi suggerirei di utilizzare un driver diverso. Questo risolverebbe il problema degli aggiornamenti delle sessioni casuali, ma introduce comunque la possibilità di apportare modifiche alla sessione che non viene aggiunta. Per quanto ne so, a questo punto con Laravel 5.1, dovrai gestirlo tu stesso.

  2. In qualche modo i dati della sessione sono troppo lunghi e vengono troncati. Se stai utilizzando il driver del database (non hai testato altri driver) e provi a salvare i dati di sessione più lunghi della lunghezza del campo, le richieste successive non saranno in grado di effettuare il pull da questa sessione e ti ritroverai senza vento con una nuova sessione. Se questo problema si verifica in modo casuale con dati di sessione molto brevi, è probabilmente la causa sopra elencata.