此刻稍微大一点的网站基本上都有好几个子域名,例如www.motui8.cn,blog.motui8.cn,这些网站倘若需要共享用户的登录信息,就必须session共享。PHP又是怎样做到多个服务器,session共享的呢?
要处理这个问题咱们首要要明白session的工作原理是什么?
session原理
客户端拜访PHP服务器时,执行session_start生成session_id,通常咱们会把session_id存储到cookie中,按照session_id相关内容并保留在服务器文件系统中,每一次请求经过cookie获取session_id,再经过session_id获取session内容。
然则客户端拜访区别服务器时,每一台服务器都会生成一个session_id,这就引起区别服务器之前没法共享session了。
处理session共享其时就两个过程
1. 多台服务器针对同一个客户端生成同一个session_id
这个比较好处理,只要咱们针对主域名来生成session_id就可。实现的方式有两种:
1.1 经过php配置文件设置session_id的cookie域名。找到php.ini文件添加如下配置: session.cooke_domain = .motui8.cn1.2 经过代码设置session_id的cookie域名,代码如下: ini_set( session.cookie_domain,motui8.cn );2. 多台服务器之前的session内容互通有没有,能够经过同一个session_id获取到内容
这一点实现起来比较麻烦,重点便是把session存储在所有服务器都能够拜访的地区。默认的存储在服务器的文件中,咱们亦能够存储在 Redis 这类缓存服务器中。针对文件系统咱们能够经过 NFS来统一存储。
2.1 文件系统
这种方式的session依赖于PHP垃圾收集器进行销毁,在高并发下session存储的目录下会产生海量的文件。这种方式会引起查询文件缓慢,并且session缓存目录可存储的文件数是有限的,有可能引起session存储失败,因此呢,咱们不意见运用文件系统存储session。
2.2 数据库存储
这种方式虽然不依赖PHP的垃圾收集器,然则会加大数据库的IO问题,增多数据的压力,引起数据读写速度变慢,因此呢这种方式,咱们亦不意见大众运用。
2.3 Redis 缓存存储
缓存数据都在内存中,读写速度快,redis还能够单独设置过期时间,自动删除无效的session。
现有的PHP框架基本都支持Redis存储session,咱们只需要配置好session关联配置就可。当然倘若你想自己但对编写session关联代码亦能够,我给大众一个示例: <?php
//起步session
session_start();
//设置session最大存活时间,单位【秒】
ini_set(session.gc_maxlifetime,60*60);
//设置session存储办法
ini_set(session.save_handler,redis);
//设置session存储路径,存储方式为redis时,路径便是redis的连接(倘若不需要授权,直接运用 tpc://127.0.0.1:6379 就可)ini_set(session.save_path,tpc://127.0.0.1:6379?persistent=1&auth=授权秘码&database=redis数据库);
//设置session内容,在内容中存储当前key的过期时间
$_SESSION[user_info] = [
data=>[id=>1],
expire=>time()+60*30
];
//获取session内容
$data = $_SESSION[user_info];
//判断当前session是不是过期
if($data[expire]>time()){
//删除session中已过期的key
unset($_SESSION[user_info]);
echo session已过期;
}else{
print_r($data[data]);
}
到此session存储的就讲完了,期盼这篇文案对大众有所帮忙。倘若有什么不对的地区,大众能够在我的公众号留言。
|