php session 常见的问题

yangl20062015年09月06日 16:52 分类 : PHP  > PHP应用
阅读: 1091

分享到微信朋友圈

Session,就是因为我们需要存储各个用户的状态数据。然而在使用中我们会有很多问题,也会遇到很多问题。 1,如何设置长生命期的session ? 将 session.cookie_lifetime ,session.gc_maxlifetime 的时间设置长一点。

Session,就是因为我们需要存储各个用户的状态数据。然而在使用中我们会有很多问题,也会遇到很多问题。

1,如何设置长生命期的session ? 
    将 session.cookie_lifetime ,session.gc_maxlifetime 的时间设置长一点。

2,为什么初始化session的时候报错?
    a,检查session文件的存储路径,路径是否对,操作权限是否够
    b,检查session初始化之前是否有html 内容输出

3,客户端在禁止使用cookie的时候,session会有影响吗?
    当客户端的cookie拒绝使用的情况下。将会带来很多的一些的不方便:php 会自动在页面的链接和表单等地方添加sessionId参数。以保证会话的继续,但是这个时候,在一个浏览器上多次手工输入一样地址,session 会认作为多次会话而不是一次。

4,为什么我的session 过几分钟就失效了?
    1,检查浏览器的cookie 是否启用,如果没有启用的话检查系统是否允许使用url传递sessionID,最后检查url_rewriter.tags设置
    2,检查session的垃圾标识时间,和回收概率

5,如何将我的session 存储在数据库内?
    利用session_set_save_handler("open", "close", "read", "write", "destroy", "gc")定制自己的处理方式。

6,如何利用session 得到当前的用户数量和列表?
    如果将session存储在数据库内,就会很容易实现,但是不管用什么方式得到的数据不一定是精确数据。

7,为什么我填写的表单在后退之后内容就不见了?
    检查脚本内有没有初始化session的动作,如果有的话,使用:session_cache_limiter('private, must-revalidate');

8,如何利用session来控制网页的缓存?
    调整session.cache_limiter ,session.cache_expire

9,我用session管理会话,如果同一个帐户在两台机器上同时登陆会有影响吗?
    不会有影响。因为这是两个sessionID.也就是说服务器上有两个session文件来保证各自的会话。 


////////////////////   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一定要设置为无效,否则就无法


yangl2006
yangl2006

精彩评论:0

还可以输入250个字 评论

评论成功

评论失败

 

微信公众号

微博