2015-10-19 13 views
7

Ho un'app L5.1 e sto riscontrando problemi con le sessioni in scadenza in modo casuale. Sta accadendo sul mio ambiente locale e sull'ambiente live, quindi non sembra che si tratti di un problema del server. Localmente sto usando XAMPP con PHP 5.5.11. Sul sito live è su un server dedicato che esegue CentOS 6 con PHP 5.6.13.Laravel 5.1 sessioni in scadenza in modo casuale

Il problema si verifica se riesco a navigare sul sito alla fine, dopo circa 20-30 pagine di richieste, le sessioni si interrompono e l'utente viene disconnesso. Sto usando il driver di database e qui è la mia sessione di configurazione:

<?php 

return [ 

    /* 
    |-------------------------------------------------------------------------- 
    | Default Session Driver 
    |-------------------------------------------------------------------------- 
    | 
    | This option controls the default session "driver" that will be used on 
    | requests. By default, we will use the lightweight native driver but 
    | you may specify any of the other wonderful drivers provided here. 
    | 
    | Supported: "file", "cookie", "database", "apc", 
    |   "memcached", "redis", "array" 
    | 
    */ 

    'driver' => 'database', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Lifetime 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may specify the number of minutes that you wish the session 
    | to be allowed to remain idle before it expires. If you want them 
    | to immediately expire on the browser closing, set that option. 
    | 
    */ 

    'lifetime' => 120, 

    'expire_on_close' => false, 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Encryption 
    |-------------------------------------------------------------------------- 
    | 
    | This option allows you to easily specify that all of your session data 
    | should be encrypted before it is stored. All encryption will be run 
    | automatically by Laravel and you can use the Session like normal. 
    | 
    */ 

    'encrypt' => false, 

    /* 
    |-------------------------------------------------------------------------- 
    | Session File Location 
    |-------------------------------------------------------------------------- 
    | 
    | When using the native session driver, we need a location where session 
    | files may be stored. A default has been set for you but a different 
    | location may be specified. This is only needed for file sessions. 
    | 
    */ 

    'files' => storage_path('framework/sessions'), 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Database Connection 
    |-------------------------------------------------------------------------- 
    | 
    | When using the "database" or "redis" session drivers, you may specify a 
    | connection that should be used to manage these sessions. This should 
    | correspond to a connection in your database configuration options. 
    | 
    */ 

    'connection' => null, 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Database Table 
    |-------------------------------------------------------------------------- 
    | 
    | When using the "database" session driver, you may specify the table we 
    | should use to manage the sessions. Of course, a sensible default is 
    | provided for you; however, you are free to change this as needed. 
    | 
    */ 

    'table' => 'sessions', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Sweeping Lottery 
    |-------------------------------------------------------------------------- 
    | 
    | Some session drivers must manually sweep their storage location to get 
    | rid of old sessions from storage. Here are the chances that it will 
    | happen on a given request. By default, the odds are 2 out of 100. 
    | 
    */ 

    'lottery' => [2, 100], 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Cookie Name 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may change the name of the cookie used to identify a session 
    | instance by ID. The name specified here will get used every time a 
    | new session cookie is created by the framework for every driver. 
    | 
    */ 

    'cookie' => 'laravel_session', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Cookie Path 
    |-------------------------------------------------------------------------- 
    | 
    | The session cookie path determines the path for which the cookie will 
    | be regarded as available. Typically, this will be the root path of 
    | your application but you are free to change this when necessary. 
    | 
    */ 

    'path' => '/', 

    /* 
    |-------------------------------------------------------------------------- 
    | Session Cookie Domain 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may change the domain of the cookie used to identify a session 
    | in your application. This will determine which domains the cookie is 
    | available to in your application. A sensible default has been set. 
    | 
    */ 

    'domain' => null, 

    /* 
    |-------------------------------------------------------------------------- 
    | HTTPS Only Cookies 
    |-------------------------------------------------------------------------- 
    | 
    | By setting this option to true, session cookies will only be sent back 
    | to the server if the browser has a HTTPS connection. This will keep 
    | the cookie from being sent to you if it can not be done securely. 
    | 
    */ 

    'secure' => false, 

]; 

Dal momento che non sono di compensazione manualmente la sessione ovunque io sono abbastanza fiducioso che niente sto facendo potrebbe essere la causa di esso. Esistono bug noti che potrebbero causare questo comportamento?

+1

Si consiglia di aggiungere un middleware per ripristinare automaticamente l'utente in base a un cookie "ripristina token" che si deve impostare all'accesso. imposta la validità del token uguale o maggiore della durata della sessione. in caso contrario, siete in balia della memorizzazione della sessione e della funzione di lotteria con bachi larvali. – r3wt

risposta

7

Se si sta usando il driver database poi a volte si può incorrere in problemi con il campo payload essere troppo breve. Per impostazione predefinita, il campo payload è un campo text, che consente 64 KB di dati.

Questo può sembrare molto, ma poiché il payload è memorizzato come array serializzato, che è fondamentalmente una stringa molto lunga, ed è quindi codificato in base64, può facilmente raggiungere la sua lunghezza massima che danneggerà efficacemente la sessione per quello utente.

Suggerirei di cambiare il tipo di dati a MEDIUMTEXT (massimo 16MB) o di ripensare quanti dati si stanno salvando alla sessione in primo luogo.

+1

Oh mio dio mikeyemi sei un genio grazie mille, devo comprarti una birra! Penso che a lungo termine abbiate detto che dovrò riconsiderare quali informazioni sto memorizzando nella sessione, ma per il momento in cui ho cambiato la colonna in media testo abbiamo risolto il problema. – geoffs3310

1

Si prega di verificare la sessione di spazzare lotteria, più in basso nella stesso file config/session.php

/* 
|-------------------------------------------------------------------------- 
| Session Sweeping Lottery 
|-------------------------------------------------------------------------- 
| 
| Some session drivers must manually sweep their storage location to get 
| rid of old sessions from storage. Here are the chances that it will 
| happen on a given request. By default, the odds are 2 out of 100. 
| 
*/ 

'lottery' => [2, 100],