会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联;对于通常的页面之间的数据传递方式get和post而言,主要处理参数的传递、资料的输入两个页面间简单的数据传递,对于一个用户的在网站上的多个页面,多种不同的数据,可能还有权限的不同而导致页面的不同、操作方式的不同等等,使用get和post非常繁琐。
1.cookie方式
为了对用户进行跟踪,就必须对用户进行标记,cookie的思想就是,当用户访问网站的第一个页面时,通过设置用户的信息标识,web服务器将其以文本文件的形式存放到用户的电脑上面,这些文件就是所谓的cookie,以键值对的方式存储,当用户再访问第二个该网站的页面时,将通过http头信息,将携带cookie文件中的信息一起访问服务器,并重新对刚才的用户信息进行验证,这样避免了每次访问都输入用户信息,可以确定多个页面之间的访问是不是同一用户了。
将信息设置到cookie的函数:setcookie($key, $value, $expire, $path, $domain, $secure)。
参数依次是:键、值、过期时间(UNIX时间戳,默认为0表示关闭浏览器则cookie消失)、存取cookie的路径,设定后服务器上该路径下的脚本可存取cookie(默认为根目录)、存取cookie的域名,只有该域名(比如www.example.com)下的网站网页可存取cookie、是否是https安全连接才启用cookie。
比如通过post提交表单后记录一些信息
<?php
if(isset($_POST)){
$time = time();
setcookie('user', $_POST['user'], $time+3600); // 时间参数需要比当前时间点大,以表示cookie信息的有效时间
setcookie('data', array(1,2,3), $time+1200); // 可以存放各种数据
} 保存cookie成功后,可直接到$_COOKIE超全局数组中以键名取得该值,非常方便,如echo $_COOKIE['user'],基本的数据类型都支持
cookie的删除仍是通过setcookie进行,最好写成将时间提前的形式,或者直接写一个键名,比如在用户点击退出时进行该项操作
setcookie('user', '', time()-200); // 时间提前,相对当前时间
setcookie('user'); // 简写,只写键名 2.session方式
session与cookie相似,只是原来将信息存在用户端的,现在改为存到服务端,但在用户端产生一个标识id,这个id默认是保存到用户本地的cookie中,所以session又和cookie扯上了关系。这样用户第一次访问时将信息存到web服务器,并随机分配给用户一个固定长度的字符串(session id),以后用户再访问其他页面,就带着这个id去服务端里找对应用户数据信息,于是就可以跟踪用户了,使用cookie的session称为基于cookie的session。
但是用户可以将浏览器设为禁用cookie(虽一般不会这么做),有的网站在检测到禁用cookie后会强制让用户去开启,但却是存在这么一种情况,如此一来通过基于cookie的方式行不通了,这时就可以通过在URL后附带一个session id的get形式传递了,当然也可以通过http post。
session的使用
首先,要用session_start()开启一个会话。注意对于这类网络函数,在它前面不准有输出,哪怕是<?php标识符前面有空格也不行(必须有输出可以用ob_start()控制,先输出到缓存 )。(注意,有时单独一句session_start()会报警告,后面会谈到)
然后,注册会话变量,也就是存取用户信息或有用的数据,不需要使用什么函数,直接存入$_SESSION超全局数组,比如$_SESSION['user'] = $_POST[['user'],这些数据将被保存到服务端的某个文件中,当然也可能是缓存(memcache、redis)中。
当跳转到其他页面时,在其他页面也要先开启这个会话,依然是session_start(),如果会话已经开启,该函数返回当前会话,如果没有则重新开启。
最后,用户退出或某些原因销毁对话,要注销这些变量。分四步走:
1.仍然是先开启会话,或者是跳转到其他页面时,再次返回已经存在的会话,需要确保前面没有输出
session_start(); // 开启或返回一个会话
2.清空$_SESSION数组中的相关变量
unset($_SESSION['robert']) // 销毁某一个变量
$_SESSION = array(); // 或者一次性全部销毁会话变量
3.清除保存在客户端的cookie,别忘了session id还在用户计算机上面
if(isset($_COOKIE[session_name()])){
unset($_COOKIE[session_name()]); // session_name()获取sesion的名,session id也是以名和值的形式存储的
} 4.彻底销毁存储到服务器的信息
session_destroy(); 四步走完,就结束了一次session会话。 3.使用会话控制的基本步骤如下:
1)开始一个会话
调用session_start()函数即可,函数的具体功能可以查阅PHP的文档。需要注意的是,必须在使用会话的脚本开始部分调用这个函数,如果没有,所有保存在该会话中的信息都无法在脚本中使用。除了手动调用session_start()函数外,也可以自动配置PHP自动调用,可以Google之。
2)注册一个会话变量
从PHP4.1以后,会话变量保存在超级全局数组$_SESSION中。要创建一会话变量,只需要在数组中设置一个元素,如$_SESSION['myvar'] = 5;
3) 使用一个会话变量
要使用一个会话变量很简单,使用$_SESSION数组访问保存的会话变量即可,如 echo $_SESSION['mywar']; 会打印出 5。使用会话前必须首先使用session_start()函数启动一个会话。
4)注销变量和销毁会话
注销变量直接使用unset即可,如unset($_SESSION['myvar']),如何要一次销毁所有会话变量,可以使用 unset($_SESSION); 当使用完一个会话后,首先应该注销所有的变量,然后再调用session_destroy() 来清除会话ID。