理解PHP中的会话控制

  会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于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。

 
 
 
posted @ 2017-09-08 21:33  WORSHIP亚萨  阅读(354)  评论(0编辑  收藏  举报