cookie 与 session深入学习

来源:互联网 发布:淘宝优内部惠券领取 编辑:程序博客网 时间:2024/05/18 03:39

     我们知道http协议时无状态的 那么我们在浏览网站的时候 如何跟踪一个用户的行为呢  很明显我们要解决的问题是我们需要知道是哪一个用户访问了

 于是cookie就出现了 他的原理就是在用户的客户端保存一个cookie(你可以理解为一个唯一标识) 比如A访问了http://www.xxx.com的网站 那么该网站就会生成一个cookie在A用户的客户端 然后每次A用户的客户端再去访问该网站时候就会自动带上这个cookie (注意:cookie是有时间的 一旦过期后就不会自动带上了 )这样的话 网站就能够跟踪用户了  那么cookie里面可以保存哪些数据呢 字符串 中文(会进行urlencode编码)等 同样cookie可以删除 更新 我们要注意一点 cookie是有过期时间的 就是说网站授权客户端多长时间 如果一旦超过了这个时间 客户端就不会自动带上了 也就是说cookie就失效了 显然服务端需要告诉客户端过期时间 如果没有设置过期时间的话 默认关闭客户端时cookie自动失效  cookie文件一般保存在c:/document and setting/adminitrator/cookies下面

     cookie这里我们做个总结 简单来说 cookie就是为了跟踪用户用的  颁发一个cookie给访问者(含有过期时间) 下次访问者带上这个cookie即可 数据是保存在客户端的

接下来我们介绍session 其实session也是用来跟踪用户的 只不过保存的位置不一样  是保存在服务端的 其原理还是基于cookie 关键是为什么还要设计session这种东西呢 当然是有原因的 第一 我们知道cookie是保存在客户端的 那么数据是极其不安全的  第二 每一次客户端去访问服务端的时候都会把数据带到服务端那么着过程就需要很大的带宽  第三 可以对用户数据进行统一管理  session的原理其实跟cookie一样也是在客户端生成一个cookie 不同的是 把数据以文件的形式(后者保存在内存都是可以)保存在服务端  每次客户端把cookie带过卡来时 服务端就会调用该cookie对应的session文件然后读取数据 从本质上讲是一样的 只不过做了一下中转 这里大家可能会问 既然session是基于cookie的 那么如果禁用的客户端的cookie 那么服务端的cookie就保存不到客户端了  那么数据自然就带不过去服务端 自然就读取不到数据了那怎么办 我们知道生成session的时候我们会生成一个cookie 那么我们就可以在url上面带上cookie值 这样就解决了 (因为客户端禁用了cookie所以客户端不能自动发送cookie 服务端等于替客户端发)sesison 几乎可以保存所有数据类型 包括对象 数组等等 session默认保存在c:/window/temp下面  当然我们是可以修改的

   session这里我们做个总结 简单来说 session也是用来追踪用户的 跟cookie不同的是 cookie是保存在客户端 session是保存在服务端的  统一管理 更加安全

  关于session我们再来谈几点:

  session默认的保存路径可以修改 通过php.ini的session,save_path修改

 session 可以自定义  读 写 回收 关闭 清除

 

<?phpfunction open($save_path, $session_name) {  global $sess_save_path, $sess_session_name;         $sess_save_path = $save_path;  $sess_session_name = $session_name;  return(true);}function close() {  return(true);}function read($id) {  global $sess_save_path, $sess_session_name;  $sess_file = "$sess_save_path/sess_$id";  if ($fp = @fopen($sess_file, "r")) {    $sess_data = fread($fp, filesize($sess_file));    return($sess_data);  } else {    return(""); // Must return "" here.  }}function write($id, $sess_data) {//这里我们可以把session保存到你认为合适的地方 global $sess_save_path, $sess_session_name;  $sess_file = "$sess_save_path/sess_$id";  if ($fp = @fopen($sess_file, "w")) {    return(fwrite($fp, $sess_data));  } else {    return(false);  }}function destroy($id) {  global $sess_save_path, $sess_session_name;         $sess_file = "$sess_save_path/sess_$id";  return(@unlink($sess_file));}/********************************************** WARNING - You will need to implement some ** sort of garbage collection routine here.  **********************************************/function gc($maxlifetime) {  return true;}session_set_save_handler("open", "close", "read", "write", "destroy", "gc");session_start();// proceed to use sessions normally?> 

这里我们可以看到 
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
这一句是说明了 我们自己注册关于session的读 写 清除 回收 关闭一系列回调函数 要想使用此功能还需要设置 session.save_handler = user 默认为file


最后我们来说说session的回收机制(gc)

跟cookie不一样 cookie的过期时间是累计的 而session则是默认1440秒 session.gc_maxlifetime =1440 但是不是累加的 应该理解为发呆时间  就是说距离最近一次的刷新时间的跨度如果大于1440的话那么则视为过期 那么什么时候清除这些过期的session文件呢  是不是每时每刻都清除一下  明显不可能 因为如果每时每刻清除的话是非常浪费资源的 所以php回收机制引进了概率删除这一概念 就是说在设定的概率下才启动垃圾回收机制 session.gc_probability = 1 /session.gc_divisor=100 表示一百分之一的概率在session_start()会话建立的时候这时候我们才启动回收机制 把一些过期的垃圾session文件清理掉 这样设计也是非常合理的

  到此session与cookie的介绍就结束了 希望大家可以有所收获 那么我这篇文章的目的也就达到了 希望与大家共同探讨与学习

 

 

0 0
原创粉丝点击