彻底理解PHP的SESSION机制

1.session.save_handler = files

    *1.session_start()
        
1.session_start()是session机制的开始,它有一定概率开启垃圾回收,因为session是存放在文件中,
PHP自身的垃圾回收是无效的,SESSION的回收是要删文件的,这个概率是根据php.ini的配置决定的,
但是有的系统是 session.gc_probability =0,这也就是说概率是0,而是通过cron脚本来实现垃圾回收。

           
session.gc_probability
=1
           
session.gc_divisor
=1000
           
session.gc_maxlifetime
=1440//过期时间
默认24分钟
           
//概率是 session.gc_probability/session.gc_divisor 结果 1/1000,

           
//不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。
           
session.save_path
=//好像不同的系统默认不一样,有一种设置是
"N;/path"
           
//这是随机分级存储,这个样的话,垃圾回收将不起作用,需要自己写脚本

        
2. session会判断当前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE键值,
这个值可以从php.ini找到

           
session.name
=
PHPSESSID //默认值PHPSESSID
            


         3.
如果不存在会生成一个session_id,然后把生成的session_id作为COOKIE的值传递到客户端.
相当于执行了下面COOKIE
操作,注意的是,这一步执行了setcookie()操作,COOKIE是在header头中发送的,
这之前是不能有输出的,PHP有另外一个函数
session_regenerate_id()
如果使用这个函数,这之前也是不能有输出的。

               
setcookie(session_name(),
                         
session_id(),
                         
session.cookie_lifetime,//默认0
                         
session.cookie_path,//默认‘/‘当前程序跟目录下都有效
                         
session.cookie_domain,//默认为空
                         
)

         4.
如果存在那么session_id =$_COOKIE[session_name];
           
然后去session.save_path指定的文件夹里去找名字为‘SESS_‘.session_id()的文件.
           
读取文件的内容反序列化,然后放到$_SESSION中
   
*2.
为$_SESSION赋值
     
比如新添加一个值$_SESSION[‘test‘]
=‘blah‘;
那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,
用把$_SESSION的值写入到session_id指定的文件夹中,然后关闭相关资源.     
这个阶段有可能执行更改session_id的操作,
比如销毁一个旧的的session_id,生成一个全新的session_id.一半用在自定义
session操作,角色的转换上,
比如Drupal.Drupal的匿名用户有一个SESSION的,当它登录后需要换用新的session_id

       
if
(isset($_COOKIE[session_name()]))
{
          setcookie(session_name(),‘‘,time() -42000,‘/‘);//旧session cookie过期
       
}
        session_regenerate_id();//这一步会生成新的session_id
      
//session_id()返回的是新的值

      3.写入SESSION操作
     
在脚本结束的时候会执行SESSION写入操作,把$_SESSION中值写入到session_id命名的文件中,可能已经存在,
可能需要创建新的文件。
   
*4.
销毁SESSION
     
SESSION发出去的COOKIE一般属于即时COOKIE,保存在内存中,当浏览器关闭后,才会过期,假如需要人为强制过期,
比如
退出登录,而不是关闭浏览器,那么就需要在代码里销毁SESSION,方法有很多,
         
o 1.setcookie(session_name(),session_id(),time() -8000000,..);//退出登录前执行
         
o 2. usset($_SESSION);//这会删除所有的$_SESSION数据,刷新后,有COOKIE传过来,但是没有数据。
         
o 3.session_destroy();//这个作用更彻底,删除$_SESSION
删除session文件,和session_id

     
当不关闭浏览器的情况下,再次刷新,2和3都会有COOKIE传过来,但是找不到数据

2.session.save_handler = user

     
用户自定义session处理机制,更加直观
    *session_set_save_handler(‘open‘,‘close‘,‘read‘,‘write‘,‘destroy‘,‘gc‘);

1.session_start(),
     
执行open($save_path,$session_name)打开session操作句柄
     
$save_path
在session.save_handler
=
files的情况下它就是session.save_path,
但是如果用户自定的话,这个两个参数都用不上,直接返回TRUE

     
执行read($id)从中读取数据.//这个参数是自动传递的就是session_id(),可以通过这个值进行操作。
    *2.脚本执行结束
     
执行write($id,$sess_data)
//两个参数,很简单
    *3.假如用户需要session_destroy()
     
先执行destroy.在执行第2步

     
一个实际例子:

      //SESSION初始化的时候调用
      function open($save_path,$session_name)
     
{
        global$sess_save_path;
       
$sess_save_path=$save_path;
       
return(true);
     
}

      //关闭的时候调用
      function close()
     
{
        return(true);
     
}

      function read($id)
     
{
        global$sess_save_path;
       
$sess_file="$sess_save_path/sess_$id";
       
return
(string)
@file_get_contents($sess_file);
     
}
      //脚本执行结束之前,执行写入操作
      function write($id,$sess_data)
     
{
        echo"sdfsf";
       
global$sess_save_path;

       
$sess_file="$sess_save_path/sess_$id";
       
if
($fp= @fopen($sess_file,"w"))
{
          $return=fwrite($fp,$sess_data);
         
fclose($fp);
         
return$return;
        }
else
{
          return(false);
       
}

      }

     
function
destroy($id)
     
{
        global$sess_save_path;

       
$sess_file="$sess_save_path/sess_$id";
       
return(@unlink($sess_file));
     
}

      function gc($maxlifetime)
     
{
        global$sess_save_path;

       
foreach
(glob("$sess_save_path/sess_*")
as$filename)
{
          if (filemtime($filename)
+$maxlifetime<time())
{
           
@unlink($filename);
         
}
       
}
        returntrue;
     
}

彻底理解PHP的SESSION机制,布布扣,bubuko.com

时间: 2025-01-15 21:06:54

彻底理解PHP的SESSION机制的相关文章

正确理解cookie和session机制原理

php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧. cookie和session机制之间的区别和联系 具体来说cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力. 而session机制采用的是一种在客户端与服务器之间保持状态的解决

理解Cookie和Session机制

转自:http://my.oschina.net/xianggao/blog/395675 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. Cookie机制 Cookie技术是客户端的解决方案,Cooki

理解Cookie和Session机制(转)

目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie的有效期 Cookie的修改.删除 Cookie的域名 Cookie的路径 Cookie的安全属性 JavaScript操作Cookie 案例:永久登录 Session机制 什么是Session 实现用户登录 Session的生命周期 Session的有效期 Session的常用方法 Session

深入理解Cookie和Session机制

首先为了让我们能够对Cookie和Session有一个初步的理解,先给出一个问题和一个例子来引出Cookie和Session,然后随后带着问题再去思考Cookie和Session二者的机制. 问题1:为什么我们在浏览网页的时候,会发现它会自动的给你推送一些内容,推送的这些内容并不是随机的, 是一些与我们之前浏览过的网页相关的这些内容,它是如何做到的了? 核心知识点: Cookie和Session都可以用来保存信息,比如注册信息.浏览记录等, 只是二者储层的地点不同,行使的功能可以说是类似的,许多

基础知识《十二》一篇文章理解Cookie和Session

理解Cookie和Session机制 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session. 一.Cookie机制 Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文

理解session机制

理解session机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息. 当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessio

Session机制详解

虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术.本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答.     一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的. session,中文经常翻译为会话,

session机制详解以及session的相关应用

session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的情况时候我们需要更加深入的理解session的机制,本文将梳理下session的相关知识,为设计可替代web容器自带的session机制打个基础. 1.1 session的概念 在计算机专业术语里:session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册入系统到注销系统之间所经过的时

&lt;转&gt;ASP.NET学习笔记之理解MVC底层运行机制

ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET MVC的异同点,并展示各自在Web领域的优劣点.在讨论之前,我对这两种技术都非常热衷,我个人觉得在实际的项目开发中,两者都能让我们受益匪浅,因此是目前Web领域两大平行和流行的技术.我们都知道,在传统的ASP.NET Web Form应用程序中,Microsoft已为我们设计了较为完整.简洁的开发