一:Session与Cookie

Session:在服务器端创建并存放在服务器的内存中的,Session的内容存储是键值对的列表,格式:名称 | 类型:长度:值 
Session的生命周期:在php.ini中 session.gc_maxlifetime 为session设置了生存时间(默认为1440s) 客户端关闭浏览器,不会影响服务器端对session的存储。

Cookie:在服务器端创建并写回到客户端浏览器,Cookie是http标头的一部分,浏览器接到响应头中关于写Cookie的指令则在本地临时文件夹中,创建了一个cookie文件,用来保存的Cookie内容。Cookie内容的存储是键值对的方式 。

Cookie的生命周期:可以设置过期时间,如果不设置则是会话级别的,即关闭浏览器就会消失。

二:执行过程

 1.  过程:
览器首次访问服务器,如果是登陆类型的网站,发送请求如果没有带身份,服务器检测不到cookie会跳转到登录窗口,输入用户名和密码后再次请求,用户信
息后验证通过后返回请求页,并在HTTP头中添加setcookie信息,浏览器接受到返回内容后会处理http头部的相应信息,这里会设置
cookie,第二次用户访问服务器时会浏览器会自动把cookie内容读取出来并加到http头部,服务器接受请求后验证提交过来的
cookies是否正确,正确直接就返回相应的页面,不正确则返回登录页面,其中会话是指从一个浏览器窗口打开到关闭这个期间。

2. 原理: PHP默认的Session是基于Cookie的,在此期间首先调用session_start()函数,Session会先判断当前$_COOKIE[session_name()]是否有值(session_name()返回保存session_id的COOKIE键名),这个值可以从php.ini找到 session.name = PHPSESSID(默认值PHPSESSID)。如果没有值,函数会创建一个唯一的SessionID,同时通过header头(header(‘Set-Cookie: session_name()=session_id(); path=/’))
将SessionID保存到客户端的Cookie中,并且在服务器端生成Session文件,文件名规则是:sess_SESSION_ID(例
如:sess_sgj1k9pq1220g5l6ne283teld1,一个128位的哈希值),Session变量的值经php内部系列化后保存在服务
器机器上的文本文件中和客户端的变量名(默认情况下)为PHPSESSID的Cookie进行对应交互。当再访问这个网站其他页面时将通过http请求头
将客户端的Cookie中保存的SessionID携带过来,这时session_start()函数不会再分配新的SessionID而是在服务器端寻
找和这个SessionID 同名的Session文件将之前保存的信息取出来。

3. 依赖性:PHP
中的Session在默认情况下是使用客户端的Cookie来保存session_id的,所以当客户端的Cookie出问题或者禁用的时候就会影响
Session的使用了。但是Session不一定必须依赖cookie。当客户端的Cookie被禁用或出现问题时,PHP会自动把
session_id附着在url中,这样再通过session_id就能跨页使用Session变量了。这种附着也是有一定条件的,即“php.ini
中的session.use_trans_sid =
1或者编译时打开打开了--enable-trans-sid选项”。但是PHP5只能在Linux平台可以自动检测Cookie的状态而在window
平台上没有此功能。

三:Session的自动回收机制

    session_start()
是Session机制的开始,它有一定概率开启垃圾回收,因为Session是存放在文件中,PHP自身的垃圾回收是无效的,Session的回收是要删
文件的,这个概率是根据php.ini的配置决定的,有的系统的设置是
session.gc_probability =0,也就是概率是0,而是通过cron或者是其他脚本来实现垃圾回收。默认配置是:

 session.gc_probability =1
session.gc_divisor =100
session.gc_maxlifetime =1440

过期时间 默认24分钟,概率是 session.gc_probability/session.gc_divisor 结果 1/100,即session_start()函数被调用1000次才会有一次调用垃圾回收程序,所以页面访问越频繁概率就越小,建议值是1/(1000~5000)。不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的。

客户端的Cookie的过期机制:失效了浏览器自然发送不了cookie到服务器,这时即使服务器的Session文件存在也没用,因为PHP不知道要读 取哪个Session文件。我们知道PHP的Cookie过期时间是在创建时设置的,那么PHP在创建session的同时为客户端创建的cookie的 生周期是多久?这个在php.ini中有设置:session.cookie_lifetime 。这个值默认是0,代表浏览器一关闭SESSIONID 就失效。那就是说我们把session.gc_maxlifetime和session.cookie_lifetime设置成同一个值就可以控制 Session的失效时间了

四:Session操作

例如:新添加一个值$_SESSION['name'] ='xiaoming'; 那么这个$_SESSION只会维护在内存中,当脚本执行结束的时候,再把$_SESSION的值写入到session_id指定的文件夹中。这个阶段有 可能执行更改session_id的操作,可能销毁一个旧的的session_id,生成一个全新的session_id,例如:角色的转换,当它登录后 需要换用新的session_id

 if (isset($_COOKIE[session_name()])) {
setcookie(session_name(),'',time() -40000,'/'); // session cookie过期
}
session_regenerate_id(); //这一步会生成新的session_id,再调用session_id()返回的是新的值

销毁session的方法有2种

第一种是通过程序session_destory()方法清除所有session   unset(session['x'])来清除指定的session['x']。

第二种是通过关闭浏览器,关闭后会直接清除所有session。

设置session生命周期的也有2种方法。

第一种  setcookie() 直接用setcookie设置session id的生命周期。

 $lifetime=60;//保存1分钟
session_start();
setcookie(session_name(),session_id(),time()+$lifetime,"/");

第二种  session_set_cookie_params()   其中session_regenerate_id();方法用于改变当前session_id的值,并保留session中数组的值。参数默认为false,如果设置为true则改变session_id的值,并清空当前session数组。

 $lifetime=60;//保存1分钟
session_set_cookie_params($lifetime);
session_start();
session_regenerate_id(true);

session相关概念

1) session id

用户session唯一标识符,随机生成的一串字符串,具有唯一性,随机性。主要用于区分其它用户的session数据。用户第一次访问web页面的时 候,php的session初始化函数调用会分配给当前来访用户一个唯一的ID,也称之为session_id。

2) session data

我们把需要通过session保存的用户状态信息,称为用户session数据,也称为session数据。

3) session file

PHP默认将session数据存放在一个文件里。我们把存放session数据的文件称为session文件。它由特殊的php.ini设置 session.save_path指定session文件的存放路径,CentOS5.3操作系统,PHP5.1默认存放在/var/lib/php /session目录中。

4) session lifetime

我们把初始化session开始,直到注销session这段期间,称为session生命周期,这样有助于我们理解session管理函数。

与session存储相关php.ini设置

1) session.save_handler = file

用于读取/回写session数据的方式,默认是files。它会让PHP的session管理函数使用指定的文本文件存储session数据。

2) session.save_path =“/var/lib/php/session”

指定保存session文件的目录,可以指定到别的目录,但是指定目录必须要有httpd守护进程属主(比如apache或www等)写权限,否则无法 回存session数据。当指定目录不存在时,php session环境初始化函数是不会帮你创建指定目录的,所以需要你手工建立指定目录。

它还可以写成这样session.save_path =“N;/path” 其中N是整数。这样使得不是所有的session文件都保存在同一个目录中,而是分散在不同目录。这对于服务器处理大量session文件是很有帮助的。(注:目录需要自己手工创建)

3) session.auto_start = 0

如果启用该选项,用户的每次请求都会初始化session。我们推荐不启用该设置,最好通过session_start()显示地初始化session。

五:Session的同步与对影响系统性能

  1:session在大访问量网站上确实影响系统性能,影响性能的原因之一由文件系统设计造成,在同一个目录下超过10000个文件时,文件的 定位将非常耗时,PHP支持Session目录hash,我们可以通过修改php.ini中session.save_path = “2;/path/to/session/dir”,那么session将存储在两级子目录中,每个目录有16个子目录[0~f],PHP session不支持创建目录,需要事先把那么些目录创建好 。

2:小文件的效率问题,一般我们的Session数据都不会太大(1~2K),如果有大量这样1~2K的文件在磁盘上,IO效率很差,PHP手册上建议使用Reiserfs文件系统。

六:同步问题(session共享)

1:使用数据库保存session, 使用数据库来保存session,就算服务器宕机了也没事,session照样在。问题:程序需要定制;每次请求都进行数据库读写开销不小(使用内存数据 库可以提高性能,宕机就会丢失数据。可供选择的内存数据库有BerkeleyDB,Mysql的内存表);另外数据库是一个单点,可以做数据库的ha来解 决这个问题。

  2:使用memcached来保存session, 这种方式跟数据库类似,不过因为是内存存取的,性能自然要比数据库好多了。当然存储在redis也是比较理想的选择,方便存储统计在线人数,那么存储在redis中也实现了这个要求,而且redis支持的数据类型多。问题:程序需要定制,增加 了工作量;存入memcached中的数据都需要序列化,效率较低;如果是文件形式的,你可以用NFS统一存储。

3:还有一种方式是通过加密的cookie来实现,用户在A服务器上登录成功,在用户的浏览器上添加一个加密的cookie,当用户访问B服务器时,检查有无Session,如果有当然没问题,如果没有,就去检验Cookie是否有效,Cookie有效的话就在B服务器上重建session。简单,高效,服务器的压力减小了,因为session数据不存在服务器磁盘上。根本就不会出现session读取不到的问题。。 问题:网络请求占用很多。每次请求时,客户端都要通过cookie发送session数据给服务器,session中数据不能太多,浏览器对cookie的大小存在限制。每个浏览器限制是不同的,比如:Firefox和Safari允许cookie 4097个字节,Opera允许cookie4096个字节,IE允许cookie4095个字节,所以不适合高访问量的情况,因为高访问量的情况下,每次请求浏览器都要发送session数据给服务器,一个cookie大小2k左右。

SESSION机制的更多相关文章

  1. zookeeper源码分析之六session机制

    zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...

  2. Cookie/Session机制详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  3. redis+cookies实现session机制(解决 手机浏览器不自动回传cookies导致session不可用问题)

    昨天在手机端测试自己的项目遇到如下情况. 1.在手机上(苹果qq浏览器),登陆时存在session中的图片验证码结果,一直获取不到,考虑是cookies的问题.但是其他网站有貌似可以正常使用cooki ...

  4. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

  5. PHP中的SESSION机制

    [转] php中cookie和session是我们常用的两个变量了,一个是用户客户端的,一个用在服务器的但他们的区别与工作原理怎么样,下面我们一起来看看cookie和session机制原理吧.   c ...

  6. session机制详解以及session的相关应用

    session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的 ...

  7. Cookie/Session机制

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

  8. [转]Cookie/Session机制详解

    原文地址:http://blog.csdn.net/fangaoxin/article/details/6952954 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用 ...

  9. 转:理解Cookie和Session机制

    原文: 理解Cookie和Session机制 摘要: Cookie工作原理 由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份.怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论 ...

随机推荐

  1. Java多线程文件下载

    一. 多线程下载文件考虑处理步骤: 1. 如何获取文件的长度 2. 合理的创建线程数量,并计算每一个线程下载的长度 3. 如何将多个线程下载的字节写入到文件中 二. 代码实现如下: package c ...

  2. python 循环语句的else语句用法,当循环条件变为假,切不是通过breakbreak终止的时候,就会执行这个else语句。

    循环语句可以有一个else子句:当(for)循环迭代完整个列表或(while)循环条件变为假,而非由break语句终止时,就会执行这个else语句.下面循环搜索质数的代码例示了这一点: >> ...

  3. CCActionManager

    当CCnode执行runAction的时候,runAction会调用动作管理类的addAction方法将它自己执行的动作传递给动作管理类,动作管理类再将动作添加到自己的动作序列中. 动过管理类通过定时 ...

  4. 下载老版本的Xcode

    1.苹果开发者中心,找到Xcode 2.点击下载 3,找到Support 4.找到所需的版本,点击"+"下载 5.安装Xcode,愉快的开发.

  5. 一次简单的绕过apk签名校验

    朋友发来一个apk,需要分析其中的一些算法,分析过程涉及到了重新打包apk,打包后的apk运行失败,估计是apk内部有检验是否被篡改的代码.检验apk是否被篡改,简单的方法是直接校验签名,如果apk签 ...

  6. sublime text3 package control 安装

    1.安装 package control 按快捷键ctrl+` 或使用菜单 View->Show Console 打开控制台,然后粘贴如下安装代码 import urllib.request,o ...

  7. TP框架自动加载优先级

    $map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Ar ...

  8. linux kernel input 子系统分析

    Linux 内核为了处理各种不同类型的的输入设备 , 比如说鼠标 , 键盘 , 操纵杆 , 触摸屏 , 设计并实现了一个对上层应用统一的试图的抽象层 , 即是Linux 输入子系统 . 输入子系统的层 ...

  9. IIS 处理请求 原理

    有时候我们会发现当我们访问一个IIS网站时,使用网址可以正常访问,但是使用IP却不行,这是什么原因呢? 原来IIS可以使用一个IP地址和端口绑定多个网站,这些网站的IP地址与端口都一样,因此在客户端或 ...

  10. Rubix - ReactJS Powered Admin Template 后台管理框架

    Rubix - ReactJS Powered Admin Template  后台管理框架,使用 ReactJS. http://rubix400.sketchpixy.com/ltr/charts ...