session和cookie是会话管理的两种方式
1,cookie
cookie存在客户端,隐藏在http头中传达给服务器。在php中通过setcookie()创建和销毁cookie。
创建(生存周期为7天):
setcookie("name","value",time()+60*60*24*7); //未设置第三个参数(有效截至日期)时,会在关闭浏览器后过期
创建value为数组的cookie:
setcookie("user[name]", "cookieone");setcookie("user[id]", "cooietwo"); //这样访问$_COOKIE["user"],它便是一个数组
注意不要在cookie里直接存敏感信息,创建前不能有任何东西输出给浏览器,因为cookie是http头的一部分。自动登陆的验证或防止cookie伪造,可以采取比如:hash(部分密码+特定字符串方式)处理用户验证
销毁(把有效期设置为当前时间之前某一时间):
setcookie("name","value",time()-1); //保证这个时间是过去的值就行
访问($_COOKIE为超全居数组,任何地方直接使用)
$name=$_COOKIE["name"]
注意,从cookie取得的数据页是不可信的,永远不要相信用户输入!
2,session
session有两种方式:基于cookie和使用url。一般使用基于cookie的方式。服务器建立session会话之后会为用户分配一个sessionid,并在服务器端的session保存目录里生成对应该id的文件,以后便凭借这个id来识别用户。
这个id一般存在cookie里(cookie默认名称为PHPSESSID,可以通过session_name()取得,可以在配置文件里修改session.name,值为php随机生成。还有很多session的配置都在配置文件里,比如有效时间,默认为0;启用垃圾回收的概率等)。
用户禁止浏览器使用cookie时,sessionid可以通过url传递(配置文件里如果session.use_trans_sid =1,在不支持cookie时php会自动把sessionid加在url上,不过不建议这种方式,因为用户会分享网址!这个配置默认为0)
1)session的开始
session_start(); //每个使用session的脚本都需要包含这个,返回类型为bool
使用这个函数后,php也许会检查是否有过期无效的session文件,检查的概率可以配置。然后自动生成sessionid或者从服务器硬盘存session的文件夹中取得该id对应的所有信息压入内存(这一点自己可以通过memory_get_usage(),microtime(true)这两个函数验证)
2)设置session信息
$_SESSION["key"]="ualue"; //脚本结束后再写入session文件,因此当前设置的脚本不能访问$_SESSION["key"]
3)取得session值
$x=$_SESSION["key"]; //超全居数组,直接使用
4)销毁
SESSION发出去的COOKIE一般在浏览器关闭后,才会过期,假如需要人为强制过期,需要人工销毁。
1,session_start();2,$_SESSION=array();//删除内存中的值3,setcookie(session_name(),' ',time() -1);//删除浏览器端cookie4, session_destroy();// 删除session文件和id,彻底销毁
大神更为详细的解读:
3,session、cookie
session大部分情况下也是基于cookie的,只是把重要的、敏感的信息没有存在cookie,只存了一个随机字符串(sessionid)而已
在配置文件里还可以设置只接受来自cookie的sessionid
cookie一般是做长时间记忆登陆的(比如一个月内不用登陆),session一般持续到浏览器关闭
cookie理论上也可以用作网站每个页面的身份识别,但是因为cookie的数据是不可信的,每次都需要对信息有所检验,而session信息存在服务器端,自然不存在这个问题。
session在网站大量采用ajax的情况下,需要处理并发问题,因为有时候多个进程在操作同一个session