PHP中的会话控制(二):session

来源:互联网 发布:js复选框取消选中事件 编辑:程序博客网 时间:2024/04/30 11:36

什么是session

session是一种会话控制方式,将来访用户的状态信息存放于服务器之中,让其他程序能通过服务器中的文件或数据库,来存取用户信息。

与cookie的区别
cookie是将用户信息存放在客户端,所以用户有权阻止cookie的使用。
session是将用户信息存放在服务器中,所以用户无法停止session的使用。

session工作原理
session在客户端仅需要保存有服务器为用户创建的一个session标识符,成为Session ID,而在服务器端(文件/数据库/Memcache中)保存session变量的值。

当某个用户向服务器发出请求,服务器首先会检查这个客户端的请求里是否包含Session ID。如果包含,说明之前已经为此用户创建过Session,服务器则按该Session ID把session检索出来使用。否则,为该用户创建一个Session,并生成一个与此session关联的Session ID,在本次响应中被传送给客户端保存。

Session在PHP中的使用
session必须首先启动,在PHP中调用session_start()函数,如下:

session_start();     //创建session,开始一个会话

注册session变量,如下:

session_start();$_SESSION['username'] = "mrhengbing";  //注册session变量,赋值为一个用户的名称$_SESSION['uid'] = 1;  //注册session变量,赋值为一个用户的ID

执行该脚本后,两个session变量就会被保存在服务器端的某个文件中。该文件目录由php配置文件php.ini中的session.save_path属性指定。

当使用完一个session变量后,可以将其删除。当完成一个会话后,也可以将其销毁。如下:

unset($_SESSION["username"]);  //删除在session中注册的用户名变量;unset($_SESSION["uid"]);  //删除在session中注册的用户ID变量;$_SESSION = array();   //将某个用户在session中注册的变量全部清除session_destroy();  //销毁和当前session有关的所有资料

使用“$_SESSION = array()”时,也将这个用户在服务器端对应的session“文件内容”清除。
而使用session_destroy()时,则是将这个用户在服务器端对应的session“文件”删除。

由于PHP默认的session是基于cookie的,所以Session ID被存储在客户端的cookie中,所以也要注意清除Cookie中保存的Session ID。而保存Session ID的cookie的标识名称就是session的名称,可以通过session_name()获取。如此,Session的注销过程共四个步骤,代码如下:

    session_start();   //第一步:开启Session    $_SESSION = array();   //第二步:删除所有session变量,也可以用unset()逐个删除    //第三步:如果使用基于cookie的session,使用setcookie()删除包含Session ID的cookie    if(isset($_COOKIE[session_name()])){        setcookie(session_name(), '', time()-3600, '/');    }    session_destroy();   //第四步:彻底销毁session

session的垃圾回收机制
上面的脚本是通过在页面提供一个“退出”按钮,单击销毁本次会话。但是如果用户没有点击“退出”,而是直接关掉浏览器,或者断网等情况,在服务器端保存的session文件是不会被删除的。

虽然下次需要分配一个新的Session ID重新登录,但这只是因为在php.ini中设置的session.cookie_lifetime=0,设定了Session ID在客户端cookie中的有效期。值为0表示“直到关闭浏览器”。

所以没有被Session ID引用的服务器端原来Session文件的就成了“垃圾文件”,对于这些永远也用不上的“垃圾文件”,系统有自动清理机制。

通过在php.ini中设置session.gc_maxlifetime的值(单位为秒),“垃圾回收程序”就会在所有session文件中排查,如果有修改时候距离当前时间超过该值的就删除。

“垃圾回收程序”是在调用session_start()时启动的。启动的概率由php.ini中的两个属性比率决定,即“session.gc_probability/session.gc_divisor”。值得注意的是,对话页面访问越频繁,概率就应当越小。

以上。

关于PHP中session的使用,更多的方法参考PHP手册:PHP:session

0 0