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. font-size:0的妙用,用于解决inline或者inline-block造成的间隙

    1.图片间的缝隙(图片间的间隙一般是由换行.缩进造成的) <div> <img src="1.jpg"> <img src="2.jpg&q ...

  2. PS扣签名

    1.用PS打开签名: 2.在图层界面切换到[通道],选择一个黑白分明或者明暗明显的签名图通道.按着“Ctrl”键就会显示出手指和方块的图标,按键的同时左击一下选择的通道: 3.切换到第一项的[图层]界 ...

  3. python turtle库

    turtle库初步 先看 https://www.cnblogs.com/chy8/p/9448606.html 一 turtle库介绍 turtle乌龟 import turtle from tur ...

  4. VUE项目 npm run build卡住不动,也不报错

    npm config set registry http://registry.cnpmjs.org try again npm run build 居然能动了....

  5. linux_批量关闭进程

    以下环境是 fedora24 linux 系统中的情况: 仿真中遇到意外弹出上百个图片,无法一下全部关闭. 可以使用: ps -ef|grep LOCAL=NO|grep -v grep|cut -c ...

  6. Ubuntu 16.04.2 配置VNC

    1安装包apt-get update sudo apt install xfce4 xfce4-goodies tightvncserversudo apt-get install vnc4serve ...

  7. storm学习总结

    1.storm shell端常用指令: 提交Topologies命令格式:storm jar [jar路径] [拓扑包名.拓扑类名] [拓扑名称]样例:storm jar /storm-starter ...

  8. PSR-PHP开发规范(本文版权归作者:luluyrt@163.com)

    遵循PSR-4的自动加载 一.简介 首先这里要了解PSR,Proposing a Standards Recommendation(提出标准建议)的缩写,就是一种PHP开发规范,让我们研发出来的代码更 ...

  9. docker zabbix

    1.zabbix-mysql 数据库 sudo docker pull zabbix/zabbix-server-mysql sudo docker run --name some-zabbix-se ...

  10. 【web渗透技术】渗透攻防Web篇-SQL注入攻击初级

    [web渗透技术]渗透攻防Web篇-SQL注入攻击初级 前言不管用什么语言编写的Web应用,它们都用一个共同点,具有交互性并且多数是数据库驱动.在网络中,数据库驱动的Web应用随处可见,由此而存在的S ...