Laravel allows you to use a few different Session drivers.
- File
- Memcache
- Redis
- Database
- Cookie
- Array
You'll notice in this list is Redis and Memcache that we can also use as our Cache Driver. Redis and Memcache are the fastest options to use for your session driver so you'll find a lot of people using this option.
The problem comes when you're using Redis as both the cache driver and the session driver.
CACHE_DRIVER=redis
SESSION_DRIVER=redis
By default these are stored in the same Redis database, therefore if you ever clear the cache of your application you will also remove the session information.
Therefore if you have a blog that on publish of a post it will perform a php artisan cache:clear
to reset the post data it will also clear all the session data in Redis, which results in all your users being logged out.
Solution
To solve this problem we need to tell Laravel there are different Redis connections, one for Cache and one for Session.
First navigate to config/database.php
at the bottom of the file you'll see the settings for redis and there will be a default connection. We need to add a new connection, using the same host, password and host but change the database number.
'redis' => [
'client' => 'predis',
'default' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 0,
],
'session' => [
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => 1,
],
],
Now we need to tell redis to use this connection as the session. Open up the config/session.php
file and find the connection
property, then change this to 'session'
.
/*
|--------------------------------------------------------------------------
| 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' => 'session',
Now when you clear the cache php artisan cache:clear
your users will no longer lose their session data and be forcing them to logout.