session与cookie的简单区别
session和cookie本质上确实是两个东西,但cookie同时也是session id的载体,cookie保存session id。
- cookie数据存放在客户的浏览器上,session数据放在服务器上。
session保存在服务器端与浏览器设置无关,cookie在客户端并受浏览器设置限制。
cookie是在你的电脑上保存的,session是在服务器上的. 也就是说你换一个电脑你的cookie就不起作用了, 而session只要你的浏览器不关就还能访问到. 通常的都是两者结合着用的. cookie的话你自己就可以通过对浏览器的设置禁用掉.这样就不起作用了
- cookie不是很安全
别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
session是服务器端缓存,cookie是客户端缓存。
cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
session是服务器保持客户端状态信息的方案,一般是保存在服务器中的一块内存中,session超时时间在服务器端进行设置。
cookie是客户端保持用户信息的方案,一般是文件形式保存,cookie清空时间是在客户端浏览器设置。
从开发角度说,session信息可以通过技术方案写到客户端保存,cookie中的用户信息,也可以在用户访问该网站时,通过技术手段自动更新用户的session信息。
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
建议:将登陆信息等重要信息存放为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如何会丢失呢?
发现造成这个原因有这几种:
- session存储路径(目录)不存在,自然就无法生成session临时文件
- session存储路径下有没有权限,如果没有,也就不可能存储session数据
- 能正常存session数据,但session存入后被清空
尝试解决的措施:
- 在项目根目录下创建phpinfo.php文件,在文件中写入phpinfo(),运行此文件,查看页面,就可以找到session的存储路径==session_save_path==,
- 在服务器上查找session存储路径是否存在,不存在创建存储目录,并分配权限,如果有session存储路径,就查看其是否有权限,没有就分配权限,
- 是否是第三个原因,可在phpinfo.php页面中查找==date.timezone==是否设置不对,然后在php.ini配置文件中找到date.timezone进行配置
需要清楚知道的:
- 在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://
- 如果将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"
原文