php不同浏览器session_id一直改变

这里不说session和cookies优点和缺点,先说说php的session运作的原理

以下以cookie传输PHPSESSID描述。

1、浏览器请求一个php的服务端页面地址。

2、服务端收到请求,php执行session_start()

3、服务端会使用 md5 / sha1来生成一个浏览器一一对应的标识PHPSESSID(此名称可以通过修改php.ini配置里的session.name来修改),可通过session_id()来获取id。(默认session存储方式为session.save_handler=files,文件形式存储,也可以配置为redis、mysql等别的存储方式。生成的session文件名规则即为sess_PHPSESSID,session文件存在session.save_path中。)

4、服务端响应头部Response Headers里Cookie包含:Set-Cookie:PHPSESSID=jrsk5mlk927ort4s69902qhru2; path=/。在客户端生成一个cookie保存此PHPSESSID

5、此时,客户端的cookie里面包含了PHPSESSID,之后客户端的每次请求头部Request Headers:Cookie:PHPSESSID=jrsk5mlk927ort4s69902qhru2。服务端之后每次接收到客户端的请求就都能根据这个PHPSESSID来找到服务端的session文件,通过对这个session文件的读写操作即实现了session的超全局变量属性。

接下来说下PHPSESSID无法保存或一直变化的两种情况

1、如果客户端禁用了cookie,由于无法使用cookie传递PHPSESSID,那么客户端每次请求,服务端都会重新建立一个session文件,而无法通过通过PHPSESSID来重用session文件,所以session也就失效了。

这种情况可以设置session.use_trans_sid来传输PHPSESSID,具体实现方式与cookie的区别就是将PHPSESSID通过HTTP的GET传输。每次请求的地址里面都会补全PHPSESSID参数”url?PHPSESSID=jrsk5mlk927ort4s69902qhru2”来实现。

2、还有一种情况使用火狐、谷歌浏览器、能够持久session,可是一换IE或别的一些浏览器一关闭浏览器重新启动PHPSESSID就会改变。
这种情况不是浏览器cookie的问题,而是服务端session.cookie_lifetime参数设置导致的,SessionID在客户端Cookie储存的时间,默认是0,代表浏览器一关闭SessionID就销毁。

在火狐、谷歌浏览器只要不设置该属性,默认Expires过期时间为session,网上说是同浏览器关闭一起销毁,经过测试并不会,所以建议一定要设置该cookie的过期时间。否则就会有问题。
通过代码ini_set(‘session.cookie_lifetime’,1440);或者修改php.ini配置给个默认时间,这个时间通常也不要比后端应用session的时间短了,防止客户端cookies提前被销毁。结合服务器端Session数据在服务器端储存的时间session.gc_maxlifetime参数。

此条目发表在服务器分类目录,贴了, 标签。将固定链接加入收藏夹。

发表回复