SESSION的理解及优化配置

  • 推荐laravel-china
  • 文章1
  • redis配置session2
  • session多服务器共享的方案梳理
  • php手册-session参数配置
  • php中Session使用方法详解
  • session 与 cookie 的关系

1.session 是存在服务端的,cookie 是存在客户端的。session 是基于cookie 才会存在的。
2.session 必须至少存在一条数据,浏览器上才会有 cookie 值存在
3.cookie 的键,是由 php.ini 中的 session.name 参数决定的,这个是识别用户用的,客户端和服务端都有这个值
4.客户端的cookie 键和值与服务端的 cookie 键值都是一致的。
5.session 数据可以存在任何地方,如果redis中,直接使用 get 即可取出数据
6.session 存在 redis 中就可以解决同域名(但二级域名不同)的跨域问题。比如 a.test.com , b.test.com

客户端请求携带的cookie.png
SESSION的理解及优化配置_第1张图片
服务端返回的cookie
session 存在 redis 中

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存储。memcache 存储的设置是一样的
session.save_handler = redis

session.save_path = "tcp://127.0.0.1:6381"  // 也可以不不添加 tcp
需要用到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分钟就过期的优惠劵?
  • 销毁 session
  session_unset();
  session_destroy();
  • 重新生成 session_id()
   session_regenerate_id();
SESSION的理解及优化配置_第2张图片
63C199EB9EE1DC08615032B849F148DC.png

你可能感兴趣的:(SESSION的理解及优化配置)