PHP-会话控制-Session

1.什么是Session

  上一节我们讨论到将数据以cookie的形式保存在客户端有很多弊端。为了解决这些问题就有了Session。

  Session是以文件的形式保存在服务器端的数据。

  服务器通过向客户端发送一个Cookie保存sessionid的方式,将session与客户端建立一对一的联系。

  浏览器:Cookie(sessionid)<------一一对应------>(sessionid)Session:服务器

 

2.开启一个会话

  session_start();
  /*开启一个会话主要做一下两件事*/
  /*1如果客户端有以cookie保存的sessionid,那么就将对应的session数据取到内存中*/
  /*2如果没有,发送一个新的sessionid以cookie的形式交给客户端保存*/

   注:如果是基于Cookie的Session因为Cookie是在http头中传递的,所以session_star()和setcookie()一样在这之前不能有任何输出。

  如图,运行一遍session_start()之后在浏览器找到了一个名为PHPSESSID的Cookie

  

  我们使用下面代码打印出客户端的sessionid

  session_start();
   echo session_id();//ldlq3n79jhkbdt120iacq19vs6

   两者的id是一致的。如果在不关闭浏览器的前提下(因为默认的是浏览器关闭时删除PHPSESSID),打开一个新的网页仍然会打印出一样的sessionid。

  如果想要更改保存sessionid的cookie保存的时间可以在配置文件中修改session.cookie_lifetime选项(以秒为单位),默认是0,表示浏览器关闭时删除。

3.Session存取数据

  PHP使用一个全局数组$_SESSION存取数据,使用起来就和普通数组一样。

  值得一提的是,内存中的数据在脚本执行完毕后就会全部销毁,所以session中的数据实际上都是要以文件的形式存到硬盘中的。而开启会话时又会把保存的数据读到内存中方便使用。

  这些操作都是有PHP自动处理的。

  

  如下,创建一个session数据

  session_start();
    echo session_id();
    $_SESSION['test']="this is a session";

 

  当代码执行完毕后会创建一个文件保存这个数据,文件名为session的sessionid。

  这个目录是通过配置文件中的session.save_path配置的,一般是'./tmp'。

  我的目录是"E:xampp/tmp",打开目录找到文件

    

  打开文件看一下

  

  这正是之前保存的值。

 

4.结束一个Session

/*第一步,开启会话,如果不开启会话PHP获得sessionid的话PHP怎么知道删除那个session呢*/
    session_start();

    /*第二步,session中的数据已经被读到内存中了,所以要清空它*/
    /*注意不能用unset($_SESSION),因为我们只是想清空数据,而不是删除这个全局数组*/
    $_SESSION=array();

    /*第三步,删除客户端的cookie*/
    /*注:默认的cookie名为PHPSESSID但是这个名字是可以在配置文件中通过session.name更改的*/
       /*所以比起使用PHPSESSID还是用session_name()函数获得cookie名稳妥一些*/
    if(isset($_COOKIE[session_name()]))
    {
        setcookie(session_name(),'',time()-1,'/');
    }

    /*第四步,删除服务器端的文件*/
    session_destroy();

 

  

5.垃圾清理机制

  假如浏览器端的cookie生命周期到了被删除以后,那么我们就没有办法用上面的方法删除保存在硬盘中的session文件了。客户端下次访问是会被分配到一个新的Sessionid,原来的文件也用不到了。

  那么这些垃圾文件怎么删除呢。

  PHP有垃圾清理机制。

  在配置文件中有三个重要选项

  session.gc_maxlifetime=  指定一个时间,以秒为单位,当垃圾清理机制启动是如果session文件的修改时间大于这个属性设置的值的话,垃圾清理机制就会删除这个文件,反之不然。

  session.gc_probability和session.gc_divisor,设S=session.gc_probability/session.gc_divisor,那么每次session_start()时有S的几率启动垃圾清理机制。

  S的值过大过小都不好,一般session.gc_probability=1,而session.gc_divisor=(1000~5000)。

 

 

 

posted @ 2018-01-17 22:08  帕特菛琦  阅读(98)  评论(0编辑  收藏  举报