Session即会话,批一种持续性的、双向的链接。Sesstion和Cookie本质上没有什么区别,都是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制。

      Session的实现可以有多种,如URL重写、Cookie,通过在Cookie中存储sessionID实现Session传递。
      针对Web网站来说,Session批用户在浏览器某个网站时,从进入网站到浏览器关闭这段时间内会话。由此可知,session实际上是一个特定的时间概念。使用session可以在网站的上下文不同页面间传递变量、用户身份认证、程序状态记录等。常见形式就是配合cookie使用,实现保存用户登录状态功能。和cookie一样,session_start()必须在程序最开始执行,前面不能有任何输出内容,否则就会出现以下警告
Warning: Cannot send session cookie-headers already sent
      类似这样的警告信息通常是因为当前页面被包含或者包含了BOM头。
      有时候,确实需要输出或者不能控制前面是否有输出,可以这么做
ob_start();
Session的工作有理
      我们看到,HTTP协议本身美工不能支持服务器端保存客户端的状态信息。为了解决这一问题,于是引入了session的概念,用其来保存客户端的状态信息。
      session通过一个称为PHPSESSID的Cookie和服务器联系。session是通过sessionID判断客户端用户的,即session文件的文件名。
      用一个形象的比喻解释session的工作方式。假设web server是一个商场的存包处,一个顾客(HTTP Request)第一个来到存包处,管理员把顾客的物品存放在某柜子里面(这个柜子就相当于session),顾客下一次来的时候,要把号码牌交给存包处的管理员。管理员根据号码牌找到相应的柜子,根据顾客的请求,取出、更换、添加柜子的物品,存包处也可以让顾客的号码牌和号码牌对应的柜子失效。顾客的忘性很大,管理员在顾客回去的时候都要提醒顾客记住自己的号码牌。这样,顾客下次来的时候,就会带着号码牌回来。
      sessionID实际上是在客户端和服务器端之间通过HTTP Request和HTTP Response会来传去。sessionID按照一定的算法生成,必须包含在HTTP Request里面,保证唯一性和随机性,以确保session的安全。如果没有设置session生存周期,sessionID存储在内存中,关闭浏览器后该ID自动注销;重新请求该页面,会重新注册一个sessionID。如果客户端没有禁用cookie,cookie在启动session会话的时候扮演的是存储sessionID和Session生存期的角色。可以手动设置session的生存期,代码如下 :
$lifeTime = 24*3600;
setcookie(session_name(),session_id(),time()+$lifeTime,'/');
也可以使用session_set_cookie_params()函数设置session的生存期。
session过期后,PHP会对其进行回收。因此,session并非随着浏览器的关闭而消失的。
      如果客户端禁用cookie怎么办?没办法,所有生存周期都是浏览器进程,只要关闭浏览器,再次请求页面又要重新注册session。
      那么怎么传递sessionID呢?通过URL或者隐藏表单。
      php.ini中把session_use_trans_sid设成1,这样连接就会自己加Session的ID。
      session以文件的形式存放在本地硬盘的一个目录中,所以当session比较我时,磁盘读取文件就会比较慢。经验告诉我们,当一个目录的文件数超过2000时,读写这个目录就会地很慢。于是想到把session分目录存放。
      php.ini里session设置部分中一一项:session.save_path="N;MODE;/path"。这项设置可以给session存放目录进行多级散列,其中“N”表示要设置的目录级数,“MODE”表示目录的权限属性,默认为600。Windows基本不用设置。“path”表示session文件存放 目录的路径,比如设置为下面的格式:
session.save_path="2;/tmp/phpsession"
      上述代码表示把/tmp/phpsession目录作为PHP的session文件存放根目录,在该目录下进行两级目录散列,第一级目录分别以0~9和a~z共36个字符作为目录名,这样存放session的目录可以达到3636个。
      注意:这里的子目录需要自己手动创建,当然是写代码。以后的session将按sid的前两位存入对应的目录中去。
      session的回收是被动的,为了保证过期的session能被正常回收,可以修改php配置文件中的session.gc_divisor参数以提高回收率(太大了会增加负载),或者设置一量判断是否过期。对于设置分级目录存储的session,php不会自动回收,需要自己实现其回收机制。

Session提要的更多相关文章

  1. day 51 cooike 与 session

    前情提要: cooike 和session 一:cooike 一.会话跟踪技术   1.什么是会话跟踪技术  我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可 ...

  2. 网络请求 爬虫学习笔记 一 requsets 模块的使用 get请求和post请求初识别,代理,session 和ssl证书

    前情提要: 为了养家糊口,为了爱与正义,为了世界和平, 从新学习一个爬虫技术,做一个爬虫学习博客记录 学习内容来自各大网站,网课,博客. 如果觉得食用不良,你来打我啊 requsets 个人觉得系统自 ...

  3. 【Spring】Spring-Session-Data-Redis实现session共享

    前言 在开发中遇到一个关于用户体验的问题,每次当运维进行更新重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session来保存的,而session对象是由服务 ...

  4. Spring Session原理解析

    前景提要: @EnableRedisHttpSession导入RedisHttpSessionConfiguration.classⅠ.被RedisHttpSessionConfiguration继承 ...

  5. session实现购物车

    为实现简单的购物功能(购物车添加.账户查看.购物车商品删除.实时的购物商品数量及价格的计算显示.购物车商品数量可手动输入等),用session实现了一简单的以php语言为基础.连接MySQL数据库的购 ...

  6. Asp.net Core中使用Session

    前言 2017年就这么悄无声息的开始了,2017年对我来说又是特别重要的一年. 元旦放假在家写了个Asp.net Core验证码登录, 做demo的过程中遇到两个小问题,第一是在Asp.net Cor ...

  7. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  8. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  9. Nhibernate的Session管理

    参考:http://www.cnblogs.com/renrenqq/archive/2006/08/04/467688.html 但这个方法还不能解决Session缓存问题,由于创建Session需 ...

随机推荐

  1. python3+ selenium3开发环境搭建

    环境搭建 基于python3和selenium3做自动化测试,俗话说:工欲善其事必先利其器:没有金刚钻就不揽那瓷器活,磨刀不误砍柴工,因此你必须会搭建基本的开发环境,掌握python基本的语法和一个I ...

  2. java基本类型的默认值

    基本类型 默认值 取值范围 (最大/最小) 字节数 二进制位数 byte 0 127(2^7-1) -128(-2^7) 1byte 8bit short 0 32767(2^15 - 1) -327 ...

  3. Eclipse配置python开发环境

    1.打开Eclipse,找到Help菜单栏,进入Install New Software…选项. 点击work with:输入框的旁边点击Add…,Name可以随便是什么,我输入的是PyDev,Loc ...

  4. PHP引用(&)练习

    <?php class talker { private $data = 'Hi'; public function & get(){ //返回值指向一个内容,这里是指向$data的内容 ...

  5. android-effect

    1. 基本框架 2.初探

  6. Runtime "Apache Tomcat v6.0 (3)" is invalid. The JRE could not be found. Edit the server and change the JRE location解决方案

    使用eclipse,启动Tomcat时出现The JRE could not be found ,Edit server and change teh JRE location的错误提示! 原因:重装 ...

  7. 【repost】js window对象属性和方法相关资料整理

    window对象有以下方法: open close alert confirm prompt setTimeout clearTimeout setInterval clearInterval mov ...

  8. 《OpenCV3编程入门》学习笔记

    把第一章的例程看完了,除了基本的操作函数,还了解了跟视频操作有关的函数,发现在自己的中心偏检测中,不仅可以处理图片,还可以对视频进行处理. 问题解决方案 1.0x7547d36f 处有未经处理的异常: ...

  9. win7 docker Toolbox 启动Docker Quickstart Terminal 失败!

    解决办法: 在windows下安装docker Toolbox 启动Docker Quickstart Terminal 失败! 主要是用如下文件启动,临时解决,或设置环境变量

  10. 包建强的培训课程(16):Android新技术入门和提高

    @import url(/css/cuteeditor.css); Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈 ...