PHP会话控制之Session介绍原理

一、Sssion的说明
1、通过SESSION(cookie是另外一种解决办法)记录用户的有关信息,以供用户再次以此身份对web服务器提起请求时作确认。会话的发明使得一个用户在多个页面间切换时能够保存他的信息。网站编程人员都有这样的体会,每一页中的变量是不能在下一页中使用的(虽然form,url也可以实现,但这都是非常不理想的办法),而SESSION中注册的变量就可以作为全局变量使用了。
2、php的会话是通过会话ID来实现, 用户在每次登陆的过程中,得到会话ID是唯一的,它可以保存在用户的机器里,或者通过URL在网络上传输。会话ID像一把钥匙,他允许我们注册特定的变量,我们称为会话变量。这些变量的内容保存在服务器端,而会话ID就是客户端唯一可见的信息,如果在网络连接中,客户端通过COOKIE或URL确定了会话的ID,那么就可以访问,会话保存在服务器上的会话变量。

二、SESSION 工作原理
client———>1.request————————->server
                       2. session_start();
   |<————-3.reponse(SESSION_ID)<——–|
   |————->4.request(SESSION_ID)———>|
                       5. session_start();
   |<————-6.reponse(SESSION_ID)<———|
   |————->7. request(SESSION_ID + logout)–>|
                      8. session_destroy();
   |<————-9. reponse(删除cookie文件)<——-|
1.client打开网页,向server发出请求,client上由于没有相应的cookie文件存在,在请求中不输送SESSION_ID
2.服务器在接受到client的请求后,通过执行session_start()函数开始进行session的处理,首先确认请求中有没有SESSION_ID,如果没有的话,
发行一个新的SESSION_ID;如果有的话,则调用那个存有SESSION_ID的文件,并把信息写入$_SESSION里去,并存入以sess_开头的文件里。
3.把写入信息的$_SESSION参数发回给client,client在GET服务器发来的信息后,把这些信息保存在cookie里。
4.client把cookie里的SESSION_ID一起写入header后再次向server发出请求。重复1-3的操作
7.client发出登出请求
8.服务器接受请求后,通过执行session_destroy()函数开始删除session文件处理
9.服务器向client发出删除保存在client上的cookie文件的命令:   setcookie(session_name(), '', time()-60, '/');
三、SESSION处理
SESSION开始
·执行SESSION开始处理的函数:session_start();
·SESSION开始后的处理:
     1.如果服务器上还没有保存SESSION变量的话,那么首先确保保存SESSION变量的空间
     2.如果client有session id送出的话,那么把保存的SESSION变量复原到$_SESSION里去
     3.Gabadge Collection功能根据启动概率来启动
注意点:1.如果php.ini中“session.auto_start = 1”的话,那么不执行session_start(),session也会自动开始。
        2.session_start(); 命令有2个目的。如果client和sever之间还没有建立session关系的话,那么服务器发行一个新的SESSION_ID,如果有的话,读取那个session文件的信息
·在一句script完了后,要做以下的输出工作:
     1.在被确保了空间的SESSION变量中写入信息数据
     2.向client发送含有session id的Cookie (这个信息在HTTP的response header里)如果客户端的cookie无效的时候,将session.use_trans_sid设定为“1”,将session id的信息通过URL或者hidden field来传输。
     3.将session信息包村起来。初始化状态的session文件名为sess_<SESSIONID>
四、SESSION手动删除
session_unset();                       多项释放。将所有登陆在session文件里的变量释放出来
unset($_SESSION[‘登录的变量名’]);    单项释放。释放所指定的登录在$_SESSION参数里的变量
$_SESSION = array();                   多项释放。释放所有登录在$_SESSION参数里的变量
session_destroy();                     删除服务器上的session文件
注意:
1.unset($_SESSION)这个函数会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量,所以此函数千万不可使用。
2.session_unset() 和 $_SESSION = array()两者的目的都是一样的,都是多项释放登陆在session文件里的变量。
但是对于PHP4.06以前的版本来说,session函数方面使用了session_register()、session_unregister()、
session_is_registered()、session_unset(),可以把global变量作为session变量进行登陆,
对于维持互换性的继续,建议使用session_unset()。
对于新版本PHP4.06以后的版本来说比较推荐使用$_SESSION = array();
五、SESSION系统设定废弃法(垃圾处理)
session.gc_maxlifetime = 1440 (初始值)
        最后一次access以后过了1440秒,自动删除被跟踪的session信息文件
session.gc_probability = 1 (初始值)
session.gc_divisor = 100 (初始值)
        Gabadge Collection启动后跟踪session信息文件。其启动概率为session.gc_probability/ session.gc_divisor
        也就是说不是每个session信息文件都有100%的被系统当作垃圾来处理的。如果直接关闭浏览器的话,session信息文件很多情况下都是留在了服务器上如果把概率改成了100%,虽然Gabadge Collection百分之百被启动了,但是这会对服务器添加负荷,也就失去了GC本身的意义了
六、关于SESSION的其他有关函数
●session.cookie_path和session.cookie_domain
  session.cookie_path 是指浏览器在打开指定的path时,向服务器发送cookie
         譬如:session.cookie_path = “/app/portal”,那么在打开/app/portal/list.php时就向服务器发送cookie信息而如果打开的是/mro/index.php的时候,就不发送cookie信息了。这个优点类似于我们在IE上设定什么样的网站启动Cookie功能,什么样的网站阻止Cookie功能一样session.cookie_domain 的设定就是把路径改成了domain,一般其色定内容和session.cookie_path一样
●session.cookie_lifetime
  session.cookie_lifetime = 0 (初始值)
      这里的有效期是指被保存在client上的cookie的有效期。初始值为0,也就是关闭浏览器的话,在client上被保存的cookie就被清除了。
●session.use_cookies
  session.use_cookies = 1 (初始值)
      session.use_cookies是设置client在保存session id的时候是否利用cookie的一个参数。当它为“1”时,就说明启动了session cookie,可以用下面的查询来得到目前的session id:<? echo "现在的session id = ". $_COOKIE["PHPSESSID"]; ?>当然,如果client的浏览器不支持cookie的话,即使这个参数等于“1”,用上述的查询也只会得到null。※为了和setcookie区别开,这里用session cookie的名字,除了两者在client上被保存的地方不同,其他还有什么区别不太明白。
●session.use_trans_sid 和 session.use_only_cookies
  session.use_only_cookies = Off (初始值)
    当它为无效的时候,允许利用cookie通过URL来传递session id,对于一些不支持cookie的浏览器而又需要session管理的来说,虽然在 security上有被攻击的可能,但这个值必须为无效,否则无法进行网页转移。 ※对于不支持cookie而又用到session来进行管理的浏览器的安全问题,我只了解这些,希望大家多多给予其他方案如果客户的浏览器是支持cookie的,那么强烈推荐“session.use_only_cookies = On”,当session.use_only_cookies为有效时,即使想通过URL来传递session id也会被认为无效,这样可以减少通过sessionid被攻击的可能性。
session.use_trans_sid = 0 (初始值)
对于一些不支持cookie的浏览器而又用到了session管理的网页,在网页转移时必须将session id填入URL里
         <form action=”nextpage.php?<?=SID?>”>,但是每个网页上都写的话就比较累人了,这里如果把session.use_trans_sid设定为“1”的话,那么只要写<formaction=”nextpage.php”>,session id就会自动加在URL上了。※这里的URL必须是相对路径当利用session.use_trans_sid为有效时,session.use_only_cookies一定要设置为无效,否则就无法使用
七、程序
1、建立session

?
1
2
3
4
5
6
7
<?php
    session_start();
    $_SESSION [ "aa" ]= "111111111" ;
    $_SESSION [ "bb" ]= "22222222222" ;
    $_SESSION [ "cc" ]= array ( '1' , 2, 4);
    echo session_id(). "<br>" ;
?>
2、删除session

?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    //开启SESSION
    session_start();
    //清空SESSION值
    $_SESSION = array ();
    //删除客户端的在COOKIE中的Sessionid
    if (isset( $_COOKIE [session_name()])){
        setCookie(session_name(), '' , time()-3600, '/' );
    }
    //彻底销毁session
    session_destroy();
?>

3、在其他页面取得session的值

?
1
2
3
4
5
6
<?php
    session_start();
    print_r( $_SESSION );
    echo session_id(). "<br>" ;     //取得session的id,它是一个32位的字符串
    echo $_COOKIE [session_name()];  //取得cookie中保留的session_id,它的变量名为<?php echo session_name();?>
?>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值