PHP中关于session的详细资料(超有用)

版权声明:转发原创文章请复制文章链接地址 https://blog.csdn.net/weixin_42579642/article/details/83039296

------------------------------------php.ini中关于session属性的相关设置-------------------------------------
1)
session.use_cookies:是否在客户端用 cookie 来存放会话 ID,1是开启 ,0是关闭
若session.use_cookies = 1
sessionid在客户端采用的存储方式,置1代表使用cookie记录客户端的sessionid,同时,$_COOKIE变量里才会有$_COOKIE[‘PHPSESSIONID’]这个元素存在

一般脚本语言都会原生支持“session机制”,如PHP程序配置:
设置php.ini的session.use_trans_sid = 1,PHP自动在URL里传递session id
设置php.ini的session.use_cookies = 1,使用cookie在客户端保存session id

2)
session.auto start:
将php.ini中的如下选项配置修改即可:
session.auto_start=0
修改成
sessioin.auto_start=1
开启session.auto_start
优点在于,任何时候都不会因忘记执行session_start()或session_start()在程序里的位置不对,而导致错误;
缺点在于,如果你使用的是第三方代码,则必须删去其中的全部 session_start(),否则将不能得到正确的结果。

3)
session的内容存在文件里的话,文件在哪儿?
如果不指定, Linux下默认在 "/tmp"目录。
线上在php.ini配置文件了做了指定,session内容存放在memcache缓存里。
默认session内容是存储在文件里的,即session.save_handler = files
但是我们线上是设置将session内容保存到memcache里的

线上环境下的配置:
[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
;session.save_handler = files
session.save_handler = memcached
session.save_path = "memcache1.huanqiu.com:11311,memcache1.huanqiu.com:11312,memcache2.huanqiu.com:11311,memcache2.huanqiu.com:11312"

4)
session的生命周期的设置
a)session的默认生命周期是多久?
答:关闭浏览器就失效
原因:因为session_id存在于cookie,而默认情况,cookie关闭浏览器即失败.
b)如何设置session生命周期为30分钟呢?
在php.ini文件里设置session.cookie_lifetime = 1800

线上生产环境下设置的是7天,生命周期是一周
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
; http://php.net/session.cookie-lifetime
session.cookie_lifetime = 604800

5)
session的名字
; Name of the session (used as cookie name).
; http://php.net/session.name
session.name = PHPSESSID

------------------------------------------session与cookie的简单区别-----------------------------------------
session和cookie本质上确实是两个东西,但cookie同时也是session id的载体,cookie保存session id。
1)cookie数据存放在客户的浏览器上,session数据放在服务器上。
session保存在服务器端与浏览器设置无关,cookie在客户端并受浏览器设置限制。
cookie是在你的电脑上保存的,session是在服务器上的. 也就是说你换一个电脑你的cookie就不起作用了, 而session只要你的浏览器不关就还能访问到. 通常的都是两者结合着用的. cookie的话你自己就可以通过对浏览器的设置禁用掉.这样就不起作用了

2)cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
session是服务器端缓存,cookie是客户端缓存。
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案

3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
session是服务器保持客户端状态信息的方案,一般是保存在服务器中的一块内存中,session超时时间在服务器端进行设置。
cookie是客户端保持用户信息的方案,一般是文件形式保存,cookie清空时间是在客户端浏览器设置。
从开发角度说,session信息可以通过技术方案写到客户端保存,cookie中的用户信息,也可以在用户访问该网站时,通过技术手段自动更新用户的session信息。

扫描二维码关注公众号,回复: 4048084 查看本文章

4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5)建议:将登陆信息等重要信息存放为session;其他信息如果需要保留,可以放在cookie中

-------------------------------------------开启session功能----------------------------------------
开启session功能是很重要的,比如下面一个场景:某个网站程序在测试服务器上调试,首页是ok的,但一到后台去登录就登录不进去,起初怀疑是rewrite规则没有写对,后排查就是因为session功能没有打开引起的!
那么session应该如何开启?
1)编辑php.ini配置文件
session.save_path=文件夹路径      指向任意一个有写权限的目录就行了.
register_globals = On           打开全局变量,如果不打开,你就这样用$_SESSION['sessioname'];但是我本人从来没成功过.
2)重启php服务即可(如果是lamp模式,就重启apache)

-----------------------------------------看一个linux下Session丢失的案例分析----------------------------------------
由于各种原因需要进行代码迁移,迁移后重新搭建php环境,运行代码。最后在登录页面时发现后台不能访问,会直接返回到登录页面,接着对代码进行测试,没有报任何错误,最后排查是因为跳转时session丢失造成的!那么session如何会丢失呢?
发现造成这个原因有这几种:
a)session存储路径(目录)不存在,自然就无法生成session临时文件
b)session存储路径下有没有权限,如果没有,也就不可能存储session数据
c)能正常存session数据,但session存入后被清空

尝试解决的措施:
a)在项目根目录下创建phpinfo.php文件,在文件中写入phpinfo(),运行此文件,查看页面,就可以找到session的存储路径,
b)在服务器上查找session存储路径是否存在,不存在创建存储目录,并分配权限,如果有session存储路径,就查看其是否有权限,没有就分配权限,
c)是否是第三个原因,可在phpinfo.php页面中查找date.timezone是否设置不对,然后在php.ini配置文件中找到date.timezone进行配置

-------------------------------------------------------------------------------------------------------------------
需要清楚知道的:
1)上面在php.ini文件里将session.save_handler修改为memcached,即表示将php的session信息存放到memcache里(前提是安装了memcached扩展),然后在session.save_path处配置连接memcache信息。如:
session.save_handler = memcached
session.save_path = "memcache1.huanqiu.com:11311,memcache1.huanqiu.com:11312,memcache2.huanqiu.com:11311,memcache2.huanqiu.com:11312"

注意:
带d的memcached扩展,则session.save_path配置连接的时候不需要加tcp://
如果是不带d的memcache扩展,则session.save_path配置连接的时候需要加tcp://

2)如果将session.save_handler修改为redis,即表示将php的session信息存放到redis里(前提是安装了php的phpredis扩展),然后在session.save_path处配置redis的connect 地址。如下:
session.save_handler = redis 
session.save_path = "tcp://127.0.0.1:6379"

猜你喜欢

转载自blog.csdn.net/weixin_42579642/article/details/83039296