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. Unity3D编辑器扩展(二)——定义自己的窗口

    上一篇我们讲了如何定义菜单按钮 https://www.cnblogs.com/xiaoyulong/p/10115053.html 这一篇我们讲如何定义自己的窗口. 定义窗口我们需要继承 Edito ...

  2. 初学者必看的文章:在VM12中安装 RedHat RHEL7.2  系统的详细步骤:看我如何操纵RHEL系统

    一.开始安装 1)新建虚拟机 RHEL7.2 2)成功引导系统--开机出现此画面 Install Red Hat EnterpriseLinux 7.2  安装RHLE7.2 操作系统 Test th ...

  3. ie9 css文件大小限制

    使用webpack生成CSS对于一些有趣的定义很有趣.不幸的是,当你拥有一个大型应用程序并且需要IE9支持时,乐趣就会停止,因为IE9会忽略你生成的CSS包中的大于4000个选择器的部分.解决方案是将 ...

  4. memset函数用法

    1. memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组 c:是赋给buffer的值 cou ...

  5. 自兴人工智能 python特点了解

    计算机语言从语言执行分类来看,大概可分为编译型语言(如Java.c++)和解释型语言(如python.javascript) 1.编译型语言  java   c++ 编写源代码.java ---> ...

  6. windows10的环境变量path如何列表显示

    如果你的变量值以%开头,打开编辑的时候就会显示一串的变量值,不方便查找编辑 所以将变量值更改为以盘符开始,就可以解决这个问题,比如:D:\WorkSoft\app\product\11.2.0\dbh ...

  7. spring profile

    配置,激活profile. 处理测试环境,开发环境,生成环境的不同配置. Javaeconfig配置Profile @Profile注解指定某个bean属于哪一个profile xml配置Profil ...

  8. 【转载】关于.NET下开源及商业图像处理(PSD)组件

    原创]关于.NET下开源及商业图像处理(PSD)组件   阅读目录 1 前言 2 .NET图像处理组件总结 3.相关资源网址        本博客所有文章分类的总目录:http://www.cnblo ...

  9. Dubbo 源码分析 - 服务调用过程

    注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...

  10. 【高速接口-RapidIO】5、Xilinx RapidIO核例子工程源码分析

    提示:本文的所有图片如果不清晰,请在浏览器的新建标签中打开或保存到本地打开 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:Vivado2015.4.2 ...