已经大半年没有更新博客了,一方面有比博客更重要的事情要作,另一方面也没有时间来整理知识,因此但愿在接下来的日子里面可以多多的写博客来与你们交流php
session的官方定义是:Session:在计算机中,尤为是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。
redis
说白了session就是一种能够维持服务器端的数据存储技术。session主要有如下的这些特色:mongodb
1. session保存的位置是在服务器端数据库
2. session通常来讲是要配合cookie使用,若是是浏览器禁用了cookie功能,也就只可以使用URL重写来实现session存储的功能后端
3. 单纯的使用session来维持用户状态的话,那么当同时登陆的用户数量较多的时候,或者存在较多的数量的session会致使查询慢的问题浏览器
本质上:session技术就是一种基于后端有别于数据库的临时存储数据的技术安全
主要的一个缘由就是HTTP的无状态性bash
由于HTTP的无状态性,因此咱们没有办法在HTTP发送请求的时候知道当前用户的状态,也就是好比说,当前是哪一个用户的之类的这种信息,因此这个时候咱们须要session来标识当前的状态服务器
接下来,经过一个模拟用户登陆的流程图来初步理解session的原理,假设这个时候用户执行登陆操做,具体的session工做流程以下:cookie
整个流程大概分红这样的几步:
1. 第一步将本地的cookie中的session标识和用户名,密码带到后台中
2. 第二步后台检测有没有对应的session标识,咱们以php为例,那么就是检测有没有接收到对应的PHPSESSID
3. 没有的话直接生成一个新的session。有的话,检测对应的文件是否存在而且有效
3. 失效的话,咱们须要清除session而后生成新的session。不失效,使用当前的session
看到这里你可能对session的工做原理有一个初步的理解
session的原理图以下:
咱们这里以PHP为例来说解一下关于session的配置
首先咱们要在PHP的安装目录下面找到php.ini文件,这个文件主要的做用是对PHP进行一些配置,具体之后涉及到再详讲。
1. 设置session存放在cookie中中标识的字段名,php中默认为PHPSESSID
对应的设置为:session.name = PHPSESSID
2. 若是客户端禁用了cookie,能够经过设置session.use_trans_sid来使标识的交互方式从cookie变为url传递
对应的设置为: session.use_trans_sid = 0
3. 设置session的保存位置
对应的设置是session.save_path="D:\phpStudy\PHPTutorial\tmp\tmp"
首先咱们须要安装wamp或者是phpstudy,具体方式自行百度
为了方便观察session文件的变化,咱们须要找到session的保存路径(在php.ini中找到session.save_path),以下:
而后找到所指向的目录,注意通常来讲session是使用files的形式来保存的,可是咱们也能够根据本身的实际状况进行修改。咱们能够在php.ini文件中进行修改和查看。
使用session的第一步,咱们要打开session,使用session_start(),而后咱们给建立的session添加一个变量,咱们假设为demo1,值为default ,代码以下:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default"; ?>
执行效果以下:
打开对应的文件,里面的内容以下:
s:7 表示的是类型为string类型,长度为7个长度的字符串
若是咱们对session中的内容进行从新编辑的话,效果以下:
咱们观察最近一条的修改日期,咱们能够发现就是日期发生了变化,可是文件名没有变化,也就是说,修改session中的内容不会致使文件被新建,而是执行对文件的从新写入操做
session的销毁
销毁session通常有两种方式,unset和session_destroy,咱们先来讲说第一种
代码以下:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; //session的销毁 unset($_SESSION); ?>
这一个至关于没有删除session文件,可是使得即便有对应的PHPSESSID也没法获取到相应的session
session_destroy()相对来讲比较完全,直接删除对应的session文件
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; var_dump(session_name()); //session的销毁 session_destroy(); ?>
运行的效果以下:
对于我的来讲比较推荐使用第二种方法,由于当要销毁session的时候,那么也就意味着session已经失效了,因此这个时候咱们把它给删掉才是最好的处理方式,一方面能够减小对硬盘的存储,另一方面能够相对优化session的查询速度。
好了,这个时候咱们应该要设置传递给浏览器端的cookie了,默认是自动传送,可是咱们应该要学习的是怎样经过后端设置cookie过去
其中有两个方法与session有关的方法咱们须要记住,第一个是session_name(),这个是获取cookie的key值得,第二个是session_id,这个是session的文件名
设置的示例代码:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session $_SESSION["demo1"] = "default_1"; setCookie(session_name(),session_id(),time()-1000); ?>
在设置cookie的时候,咱们为了程序的安全性,咱们应该要禁止JS能够对cookie进行重写,因此须要设置HTTP ONLY,具体的设置方法在Php.ini中找到session.cookie_httponly
而后将其的值设置为1或者true便可
除此以外还能够经过setCookie和ini_set()来动态设置HTTPONLY属性
在使用session的时候,虽然会从浏览器把PHPSESSID传给后端,可是这个课程不须要人为的去参与。咱们只须要保证HTTPONLY被设置就好了。下面是完整的代码:
<?php /** * Created by PhpStorm. * Date: 2017/12/16 */ session_start();// 打开session if ($_SESSION) { var_dump($_SESSION["demo1"]); } else { $_SESSION["demo1"] = "default_" . time(); var_dump($_SESSION["demo1"]); setCookie(session_name(), session_id(), time(), NULL, NULL, NULL, true); } ?>
1. 关闭浏览器session一样存在
若是咱们没有人为的去设置cookie的生命周期的时候默认关闭浏览器session的状态是没法被保存下来的,由于没有设置cookie的生命周期,默认这个时候cookie为session cookie也就是在会话存在的时候cookie才有效,因此关闭浏览器cookie失效,致使后端拿不到对应的PHPSESSID,因此没法找到对应的session文件
2. session性能瓶颈怎样解决?
若是是后端存在大量的session的时候,那么这个时候就会出现性能的瓶颈,例如:当后端同时存在有5000个session文件的时候,假设要找的文件是在第4999个,那么也就是说前面至少须要遍历4998次,这样就会浪费过多的时间在后端的循环遍历查找文件中,因此这个时候最有效的方法是使用redis或者mongodb,原理是经过将本来保存在本地的session文件写入到内存中,经过内存换空间的形式来达到提高速度
3. 通常不使用URL重写的方法来传递PHPSESSID
其中主要有两个缘由,一个是URL重写方式传递的话会致使URL混乱,影响美观。另外一个是增大了用户误操做的概率
更多的session的相关配置请点击这里
[Session]
session.save_handler = files
#session的存储方式
session.use_cookies= 1
#使用cookies在客户端保存会话
session.use_only_cookies = 1
#去保护URL中传送session id的用户
session.name = PHPSESSID
#session名称(默认PHPSESSID)
session.auto_start = 0
#不启用请求自动初始化session
session.cookie_lifetime = 0
#cookie存活时间(0为直至浏览器重启,单位秒)
session.cookie_path = /
#cookie的有效路径
session.cookie_domain =
#cookie的有效域名
session.cookie_httponly =
#httponly标记增长到cookie上(脚本语言没法抓取)
session.serialize_handler = php
#PHP标准序列化
session.gc_probability =1
session.gc_divisor =1000
#建议设置1000-5000
#几率=session.gc_probability/session.gc_divisor(1/1000)
#页面访问越频繁几率越小
session.gc_maxlifetime =1440
#过时时间(默认24分钟,单位秒)
session.bug_compat_42 = off
#全局初始化session变量
session.bug_compat_warn = off
session.referer_check =
#防止带有ID的外部URL
session.entopy_length = 0
#读取的字节
session.cache_limiter = {nocache,private,pblic}
#HTTP缓冲类型
session.cache_expire = 180
#文档过时时间(分钟)
session.use_trans_sid = 1
#trans_sid支持(默认0)
session.hash_function = 0
#hash方法{0:md5(128 bits),1:SHA-1(160 bits)}
session.hash_bits_per_character = 5
#当转换二进制hash数据奥可读形式是,每一个字符保留位数
session.save_path =
"/var/lib/php/session"
#session id存放路径