欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

[PHP]PHP的session机制,配置与高级应用

程序员文章站 2022-05-31 09:46:45
...

--------------------------------------------------------------------------------------------------------- 一. PHP的session原理: 1.开启session_start(),服务器端产生session文件,将相关信息存储到这个文件中,文件以"sess_"为前缀,连接session_i

---------------------------------------------------------------------------------------------------------

一. PHP的session原理:

1.开启session_start(),服务器端产生session文件,将相关信息存储到这个文件中,文件以"sess_"为前缀,连接session_id()值来命名(内容是由特定算法生成的用户的明文信息,大型项目则须进行加密处理),同时将sessionid保留到客户端浏览器的cookie中。

2.第二次开启session_start(),浏览器判断cookie中是否有sessionid,如果有,不再创建文件,而是直接使用这个sessionid访问服务器,通过sessionid找对应的session文件,读取session中内容存储到$_SESSION数组中。

注意:session_start()前不能有任何输出,此函数向客户端发一个session_id保存在cookie中。

二. PHP机制使用session:

  1.开启session

    session_start();

  2.存取session

    $_SESSION['uname'] = 'chenwei';

  3.销毁session

   unset($_SESSION['uname']);         //删除内存中由session数组保存的变量;$_SESSION = array()清楚所有session变量

   setCookie(session_name(), '', time()-1, '/');  //删除客户端cookie中的sessionid, session_name()默认是PHPSESSID

   session_destory();               //销毁服务器端session文件

三. PHP的session配置选项

查看session配置的最直接方式就是phpinfo(); 然后根据需要配置/usr/local/php/etc/php.ini文件里的session选项,其实一般默认就可以。

可以考虑更改的配置选项有:

  session.cookie_lifetime = 0;     //设置cookie保存时间(秒),相当于session的过期时间,0表示直到浏览器重启

  session.save_handler = files;     //保存和取回数据的方式,默认为文件; 涉及到存储机制,此处不作延伸

当然也可以不修改配置文件,使用系统函数,达到同样的效果:

  setCookie(session_name(), session_id(), time()+1440, '/'); //设置cookie有效时间为1440秒(24’),解决关闭浏览器session丢失的现象;session在服务器上存的最长时间为24’,重新连接后才不会过期。(即保持登录功能)

四. PHP的session自动回收机制(启动概率 = session.gc_probability / session.gc_divisor)

  session.gc_probability = 1     //启动几率

  session.gc_divisor = 1000     //被除数,因子

  session.gc_maxlifetime = 1440  //设置session的最大过期时间,默认1440''

只要客户端存在操作,session过期时间就会保持不减;当超过过期时间未操作,回收机制就会启动,将服务端session删除。

  

五. 基于URL传递session的id(解决客户端禁用cookie的情况)

  1. url传参:

    DEMO

  服务端处理:

    $sid = !empty($_GET[session_name()]) ? $_GET[session_name()] : '';

    session_id($sid);  //设置用已有的sid开启会话,在session_start()之前

    session_start();

  2. 如何自动判断是否开启了cookie,并使用对应的传递方式?(使用系统自带SID常量,自动判断)

    DEMO

    $sid = !empty($_GET[session_name()]) ? $_GET[session_name()] : '';

    if($sid != ''){

      session_id($sid);

    }

  3. 使URL自动加session的id?

    enable_trans_uid配置选项,和运行时选项session.use_trans_sid都被激活时,当客户端禁用cookie时,相对的URL将自动被修改为包含sessionid,如果没有配置或使用Windows服务器,可以使用常量SID。

Link: http://www.cnblogs.com/farwish/p/3909087.html

@黑眼诗人