zoukankan      html  css  js  c++  java
  • 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

     

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

     

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

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

    <?php
    	session_start();
    	print_r($_SESSION);
    	echo session_id()."<br>";     //取得session的id,它是一个32位的字符串
    	echo $_COOKIE[session_name()];  //取得cookie中保留的session_id,它的变量名为<?php echo session_name();?>
    ?>
    
     
     
  • 相关阅读:
    年末反思
    Flink运行时架构
    Phoenix 启动报错:Error: ERROR 726 (43M10): Inconsistent namespace mapping properties. Cannot initiate connection as SYSTEM:CATALOG is found but client does not have phoenix.schema.
    Clickhouse学习
    Flink简单认识
    IDEA无法pull代码到本地,Can't Update No tracked branch configured for branch master or the branch doesn't exist.
    第1章 计算机系统漫游
    简单的 Shell 脚本入门教程
    开源≠免费 常见开源协议介绍
    MySQL 视图
  • 原文地址:https://www.cnblogs.com/gxldan/p/4066843.html
Copyright © 2011-2022 走看看