设为首页 收藏本站
查看: 450|回复: 0

[经验分享] PHP 会话控制

[复制链接]

尚未签到

发表于 2015-8-28 10:47:58 | 显示全部楼层 |阅读模式
  setcookie()函数设置cookie,函数原型如下
  bool setcookie ( string $name [, string $value [, int $expire = 0 [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]]]] );
  cookie标题头必须在发送其他标题头之前发送,否则就无效(这是cookie的限制,而不是PHP的限制)
  




<?php
setcookie("mycookie", "cnblog");
echo $_COOKIE['mycookie'];
?>
  在会话中使用cookie:使用cookie也存在一些问题,有些浏览器不接受cookie,一些用户可能将浏览器的cookie功能关闭了。故PHP会话控制使用cookie/URL双模式
  会话函数session_get_cookie_params() 查看有会话控制设置的cookie内容,也可以用session_set_cookie_params()来设置会话cookie的参数
  array session_get_cookie_params ( void )
  void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
  




<?php
  session_set_cookie_params(time()+2500,'./testing/','localhost');
  print_r( session_get_cookie_params());
?>
  




<?php
  session_start();
  $_SESSION['test'] = 'nodot';
  echo $_SESSION['test'];
  session_destroy();
?>
  
  ////////////////////////////////////   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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-105439-1-1.html 上篇帖子: php项目案例(投票系统) 下篇帖子: PHP 中 iconv函数的用法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表