SESSION的理解
1.
SESSION
是保存到了服务器上,而cookie
是保存在了客户端
2.PHPSESSID
是保存在cookie
里面
3.SESSION
是根据PHPSESSID
值来识别用户的
4.同一个浏览器的PHPSESSID
值是固定的,正是因为这样,才识别了用户的session
5.拿到PHPSESSID
值,就可以拿到本服务器上
本客户的所有session
值
6.多台服务器之间共享SESSION
其实是要做到PHPSESSID
共享
7.PHPSESSID
只要不关闭网页,怎么刷新都是一样
8.在 PHP 中,保存 session_id 的 cookie 名称默认叫作PHPSESSID
,这个名称可以通过 php.ini 中session.name
来修改,也可以通过函数session_name()
来修改。
无论是通过调用函数 session_start() 手动开启会话, 还是使用配置项 session.auto_start 自动开启会话, 对于基于文件的会话数据保存(PHP 的默认行为)而言, 在会话开始的时候都会给会话数据文件加锁, 直到 PHP 脚本执行完毕或者显式调用 session_write_close() 来保存会话数据。 在此期间,其他脚本不可以访问同一个会话数据文件。
对于大量使用 Ajax 或者并发请求的网站而言,这可能是一个严重的问题。 解决这个问题最简单的做法是如果修改了会话中的变量, 那么应该尽快调用
session_write_close()
来保存会话数据并释放文件锁。 还有一种选择就是使用支持并发操作的会话保存管理器来替代文件会话保存管理器。
-
php.ini
中的session配置
[Session]
session.save_handler = files
session.save_path = "/tmp"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0 // 发送到浏览器的 cookie 的生命周期
session.serialize_handler = php
session.gc_divisor = 1000
session.gc_probability = 1
session.gc_maxlifetime = 1440
- 如果使用
redis
存储
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6381"
需要用到tcp来连接redis,如果你设置reids 有密码访问的话,这样加上就可以了:
tcp://127.0.0.1:6381?auth=authpwd
session同步
在做了web集群后,你肯定会首先考虑session同步问题,
因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,
如果不同的服务器用的是不同的redis服务,那么可能就会出现,一个登录用户,一会是登录状态,一会又不是登录状态。
所以session这个时候就要同步了。刚好,我们选择用redis作为了存储,是可以在多台redis 服务器中同步的。
具体可以搜索 reidis主从同步或者redis 集群
为什么重启浏览器后 Session 数据就取不到了
session.cookie_lifetime
以秒数指定了发送到浏览器的 cookie 的生命周期。值为 0 表示"直到关闭浏览器"。默认为 0。
如何设置一个严格30分钟过期的Session
使用memcache, redis等,因为他们本身就支持过期时间设置,他们又是键值对存储方式
1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.
2. 自己为每一个Session值增加Time stamp.
3. 每次访问之前, 判断时间戳.
最后, 有同学问, 为什么要设置30分钟的过期时间: 这个, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠劵?