session是什么:

session即会话,是一种持续性,双向的连接。

session和cookie在本质上没什么区别,都是针对http协议的局限性提出的一种保持客户端和服务端会话状态的机制。

session的实现

1.cookie : 通过在cookie中存储sessionID

2.url重写:index.php?PHPSESID=01aab840166fd1dc253e3b4a3f0b8381

(通过session.use_cookies来控制使用哪一种方式)

session的工作原理:

sessionID实际上在客户端和服务器端是通过HTTP Request(发送cookie)和HTTP Response(设置cookie)传来传去。

sessionID通过一定的算法生成,保证唯一性和随机性,以确保session安全。

当sessionID销毁后,重新请求该页面,会重新注册一个sessionID,所以同一个浏览器和同一个服务器之间sessionID也是随机的。

session的保存:

默认文件的形式保存在服务器的/tmp下,文件名类似:sess_01aab840166fd1dc253e3b4a3f0b8381,后边是随机32位编码字符串。

格式:变量名|类型:长度:值,例如username|s:3:"lee";last_date|s:10:"2015-01-02";

session的使用:

session_start()必须在程序最开始执行,前边不能有任何输出,否则出现以下警告:

Warning:Cannot send session cookie - headers already send

解决:

办法1:在php.ini中修改session.auto_start = 1,自动开始,不需要session_start()

办法2(在不确定前边是否有输出的时候):

ob_start();  //开启output_buffering
session_start();
$_SESSION["user"]="username";
ob_end_flush();

session的回收:

在php.ini中设置session.gc_maxlifetime,session的最大生存时间。

session的回收是通过检查/tmp/sess_xxx文件的最后修改时间和当前时间的差值。

如果”最后的修改时间”到”现在”超过了gc_maxlifetime(默认是1440)秒,这个session文件就被认为是过期了,在下一次session回收的时候,如果这个文件仍然没有被更

过,这个session文件就会被删除(session就过期了)。

默认情况下,每一次php请求,就会有1/100的概率发生回收,所以可能简单的理解为“每100次php请求就有一次回收发生”。这个概率是通过以下参数控制的

//概率是gc_probability/gc_divisor 

session.gc_probability = 1 //通过调大这个参数提高回收率,但太大了会增加负载

session.gc_divisor = 100 

注意1:

假设这种情况gc_maxlifetime=120,如果某个session文件最后修改时间是120秒之前,那么在下一次回收(1/100的概率)发生前,这个session仍然是有效的。

保证精确的session删除时间方法:在session中记录最后登录时间,每次访问都判断是否超过时间,超过就退出,否则更新最后登录时间。

(这是面试时问题:怎样能保证session在20分钟过期?因为本身的gc回收是有一定概率的)

注 意2:

如果你的session使用session.save_path中使用别的地方保存session,session回收机制有可能不会自动处理过期 session文件。这时需要定时手动(或者crontab)删除过期的session

cd /path/to/sessions; find -cmin +24 | xargs rm 

最新文章

  1. Python之路【第五篇】python基础 之初识函数(一)和文件管理
  2. python操作mongodb数据库
  3. 推荐几款自己写博客使用的Ubuntu软件
  4. sizzle源码分析 (2)ID 类 tag querySelectorAll 快速匹配
  5. [Android Pro] Android 进程级别 和 oom_adj对应关系
  6. MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下)
  7. 设计模式组合模式(Composite)精华
  8. python socket编程---从使用Python开发一个Socket示例说到开发者的思维和习惯问题
  9. pager-taglib插件进行普通分页
  10. 第六章:3D向量类
  11. JavaScript的预编译和执行
  12. SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
  13. nginx——配置 Nginx 防盗链
  14. list tuple
  15. SQL Server进阶(五)子查询
  16. 查看Linux磁盘空间
  17. Linux内核分析——可执行程序的装载
  18. JavaScript----特效代码
  19. unity-------Light的各个参数使用
  20. JSTL时间格式化项目小试

热门文章

  1. quartz启动时间配置
  2. 【USACO】Transformations(模拟)
  3. 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)
  4. 升级ubuntu,apt-get update出现Hash Sum mismatch
  5. 如何使用TestFlight进行Beta测试
  6. BeautifulSoup_python3
  7. Leetcode 368. Largest Divisible Subset
  8. dbm速算
  9. nginx实现http反向代理+负载均衡
  10. C#基础之数组排序,对象大小比较