Laravel 5.1 使用 Session 共享

2015/12/02

两个或多个项目使用 Laravel 自带的 Session 机制把 SessionId 丢进 Redis 缓存 Key Value 数据库实现 Session 共享。

需要引用第三方 Package nrk/predis

创建两个 Laravel 5.1 项目

项目一称之为: account-project AND 项目二称之为: user-project

1.composer.json 中引入 predis

{
	"require": {
		"predis/predis": "1.1.*@dev"
	}
}

2.更新 Composer 下载 Package

composer update

配置 Laravel 框架

1.配置 Laravel 框架下 .env 文件中 Session 驱动、缓存驱动、APP_KEY

APP_KEY=5FVu9DwcqK1R5mwQwLNJ6RgpQ4k9zj1O	

CACHE_DRIVER=redis	//顺道把缓存驱动也配置为 Redis 驱动
SESSION_DRIVER=redis

//两个项目配置统一驱动都为 Redis ,还有就是两个项目的 `APP_KEY` 统一个 Key。

2.配置 Redis 服务器连接,来到 config\database.php 文件中配置数组 Key 为 Redis 的链接信息。

'redis' => [
	'cluster' => false,
	'default' => [
		'host'     => '127.0.0.1',
		'port'     => 6379,
		'database' => 0,
	],
],
//我这里使用的是 Homestead 虚拟环境默认配置即可,如果你有 Redis 服务器请更改。

3.配置 config\session.php 文件中 Key 为 domain 的 Value

'domain' => '.userdomain.com';	//你域名的根

测试

1.在 account-project 项目中 routes.php 中配置一条路由

Route::get('/test-set-cache-session',function(){
	Cache::put('cache1','cache1-value',1);
	Cache::put('cache2','cache2-value',1);
	Session::put('session1','session1-value',1);
	Session::put('session2','session2-value',1);
	return Session::getId();
});
//此条路由分别用 Cache 设置两条数据和两条 Session 数据,最后返回 SessionId

2.在 user-project 项目中 routes.php 中配置一条路由

Route::get('/test-get-cache-session',function(){
	$data = [
		'cache1'=>Cache::get('cache1'),
		'cache2'=>Cache::get('cache2'),
		'session1'=>Session::get('session1'),
		'session2'=>Session::get('session2'),
		'session_id'=>Session::getId()
	];
	return $data;
});
//此条路由分别获取获取两条 Cache 数据和两条 Session 数据及 SessionId ,最后返回数据

用浏览器打开两个项目地址

1.开设置 Session 的项目: http://account-project.userdomain.com/test-set-cache-session

#浏览器输出

SessionId: `df7bec16715cbea5516697d8cd9f2a5f61db8af1`

2.接着打开另外一个项目: http://user-project.userdomain.com/test-get-cache-session

#浏览器输出

{
	"cache1": "cache1-value",
	"cache2": "cache2-value",
	"session1": "session1-value",
	"session2": "session2-value",
	"session_id": "df7bec16715cbea5516697d8cd9f2a5f61db8af1"
}

很明显两个 SessionId 都一样,说明你的两个 Laravel 项目可以共享 Session 了。

总结

写的比较简略,自己做个笔记。Laravel 框架默认会存放一个 laravel_session 的 Cookie 在客户端,这个 Cookie 里面的 SessionId 和 Redis 中的 SessionId 是一致的!如果 Redis 中 SessionId 被清空,客户端 Cookie 中的 SessionId 还存在,只要客户端在次连接或刷新, Redis 中会同步客户端中的 SessionId 。只要客户端 Cookie 还在,你可以随时获取,比如根据 SessionId 从 Redis 缓存中获取用户的信息。个人觉得 Larave 自己的 Session 机制还是比较实用的。