深刻认识一下session
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
深刻认识一下session的更多相关文章
- session和cookie的最深刻理解
先说session 对SESSION的争论好象一直没有停止过,不过幺麽能理解SESSION的人应该占90以上.但还是讲讲,别嫌老~ 有一些人赞成用SESSION,有一些人不赞成.但这个问题到底要怎么说 ...
- nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)
本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...
- [转载]深入理解HTTP Session
深入理解HTTP Session session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...
- php session的理解与使用
session学习参考链接:1.http://www.w3cschool.cn/php_sessions.html:2.http://php.net/manual/zh/book.session.ph ...
- express 框架之session
一.什么是session? 最近在学习node.js 的express框架,接触到了关于session方面的内容.翻阅了一些的博客,学到了不少东西,发现一篇博文讲的很好,概念内容摘抄如下: Sessi ...
- HTTP Session原理
深入理解HTTP Session session在web开发中是一个非常重要的概念,这个概念很抽象,很难定义,也是最让人迷惑的一个名词,也是最多被滥用的名字之一,在不同的场合,session一次的 ...
- Php学习之SESSION反序列化机制
在php.ini中存在三项配置项:session.save_path="" --设置session的存储路径session.save_handler="" -- ...
- session 原理 数据结构
[原创]转载请保留出处:shoru.cnblogs.com 晋哥哥的私房钱 引言 在web开发中,session是个非常重要的概念.在许多动态网站的开发者看来,session就是一个变量,而且其表现像 ...
- ASP.NET 之深入浅出Session和Cookie
在做人事档案管理系统中,对于Session和Cookie的使用后理解更加深刻了,下面对本知识点总结学习. Session是什么? 简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有 ...
随机推荐
- Edge detection using LoG
intensity梯度值分布跟图片的大小有关, 比如将一张小图片放大后会变得很模糊, 原先清晰的edge, 即大的梯度值变得模糊. 但是原有的边缘通常还是肉眼可分辨的. 但用Sobel 算子可能就检测 ...
- Entity Framework在WCF中序列化的问题
问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...
- JavaScript写一个连连看的游戏
天天看到别人玩连连看, 表示没有认真玩过, 不就把两个一样的图片连接在一起么, 我自己写一个都可以呢. 使用Javascript写了一个, 托管到github, 在线DEMO地址查看:打开 最终的效果 ...
- Echarts-画堆积柱状图,折线图
导入echarts包 <script src='../scripts/libraries/echarts/echarts-all.js'></script> js var my ...
- dede使用方法----调用导航
在这里,极力推荐学习dede的朋友们观看老李的零基础织梦仿站系列课程的视频,讲的超级棒的~~ 网址链接是:http://www.dede888.com/15daylessons.html. 好了,言归 ...
- Windows 8.1 安装Ruby on Rails手记
最近喜欢上了狂拽酷炫的Ruby 看了诸多文章都是Linux或Mac OS X环境配置,文章末尾还不忘把windows黑成一坨... 表示很无语.. 作为新世纪隐秘而强大的 .Net程序员 怎能脱离宇宙 ...
- linux软件包的安装和卸载
这里分两种情况讨论:二进制包和源代码包. 一.linux二进制分发软件包的安装和卸载 Linux软件的二进制分发是指事先已编译好二进制形式的软件包的发布形式,其长处是安装使用容易,缺点则是缺乏灵活性, ...
- bzoj3514Codechef MARCH14 GERALD07加强版
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- body中设置-webkit-scrollbar竖向滚动条,在手机浏览器上无效
暂时无解,如果是chrome的PC模式,滚动条是没有的,但如果是手机模式,滚动条会出现,且无法设置其样式,滚完后会自动消失. 如果设置div这些块元素,完全没问题.
- NuGet包引用依赖问题
如A包需要引用B包,然后在项目中安装A包时,自动把B包也装上. 在nuget命令行打包的时候,如果是指定项目的csproj文件进行打包的,都只能打包当前项目的dll,那么如果使用了第三方的dll而没有 ...