Session提要

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不会自动回收,需要自己实现其回收机制。

时间: 2024-10-29 05:23:42

Session提要的相关文章

COOKIE+SESSION

cookie的缺点: 因为cookie保存在浏览器上,所以安全性低可控性比较差,只能存放字符串大多数的浏览器对cookie有4K的限制. 下面是cookie在浏览器和服务器中请求与响应的过程: 1.    COOKIE的工作原理 cookie过程描述 网站为了辨别用户身份.进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密) 用户第一次访问你的网站->在服务器端会将用户的信息设置为cookie(可以理解为制造饼干过程)->通过http协议发送给用户(浏览器),在用户端,coo

Nginx做负载均衡时session共享问题详解

用nginx做负载均衡时,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 再者Nginx连接Memcached集群时,Nignx的请求从memcached服务器中根据key获得了value则直接返回value,如果没有获得到value则去MySQL中查询再返回. location / { set $memcached_key "$request_uri"; #设置请求memcached服务器的key memca

会话技术Session&Cookie

一.会话技术简介 1.存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪     里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话技术是帮助服务器   记住客户端状态(区分客户端) 举例购物过程: 2.会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Cookie和Sessio

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存

JavaWeb基础—会话管理之Session

一.什么是session session类似于客户端在服务器端的账户.使用Map存放 一个会话锁定一个用户(一般情况下是一个客户端,即一个浏览器独占一个session对象),即使使用浏览器访问其他程序资源,也可以共享这个session (如何确定是同一个用户?创建session时把sessionID以cookie的形式传给客户端,客户端访问时再把此sessionID传过去进行校验 JSESSIONID ) 二.session和cookie的区别 cookie 把用户的数据保存到浏览器端,sess

session和cookie的区别

原作者:施杨(施杨's Think out)出处:http://shiyangxt.cnblogs.com 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie 里的内容来判断使用者,送出特定的网页内容给你. Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cook

Redis主从复制实现session共享

一.Redis安装 1. 下载安装扩展源及源码包 yum install -y epel-release jemalloc-devel wget https://codeload.github.com/antirez/redis/tar.gz/2.8.21 tar -zxvf 2.8.21 make:make PREFIX=/usr/local/redis install mkdir -p /usr/local/redis/etc 解决办法: cd deps/ make hiredis lua

cookie和session得区别

1.cookie 是一种发送到客户浏览器的文本串句柄,并保存在客户机硬盘上,可以用来在某个WEB站点会话间持久的保持数据. 2.session其实指的就是访问者从到达某个特定主页到离开为止的那段时间. Session其实是利用Cookie进行信息处理的,当用户首先进行了请求后,服务端就在用户浏览器上创建了一个Cookie,当这个Session结束时,其实就是意味着这个Cookie就过期了. 注:为这个用户创建的Cookie的名称是aspsessionid.这个Cookie的唯一目的就是为每一个用

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi