您现在的位置是:网站首页 > 心得笔记

会话控制——session

盛悦2019-03-26527人围观
简介session和cookie在本质上是没有区别的!都是针对http无状态而提出的一种保持客户端和服务器之间保持会话连接状态的一种机制!不同语言中,session使用方法不同!

1、什么是session

session和cookie在本质上是没有区别的!都是针对http无状态而提出的一种保持客户端和服务器之间保持会话连接状态的一种机制!不同语言中,session使用方法不同!

2、session工作原理

1.准备建立会话的时候,PHP会先查看请求中是否包含session_id,如果没有,服务器会在自己的内存里创建一个新的变量,这个变量就是session_id,假如,这个变量就是session_1234

2.服务器会把session_id发送到浏览器保存,一般浏览器会把这个id保存在cookie中

3,之后每次我的浏览器再去访问服务器的时候,都会携带cookie中存储的这个session_1234,这样服务器就认识这个浏览器了

4,服务器端的这个session_1234变量就可以存放任意的会话数据了,这些数据是序列化之后存放进去的

5,每次浏览器访问服务器都可以凭借自己的session_id到服务器的这个变量中认领自己的信息

6,如果想销毁会话,可以删除掉会话中的数据,销毁会话文件

3、PHP中如何使用会话

1.开启会话session_start();在session_start()之前不能有任何输出!

2.可以通过$_SESSION来设置相关值,设置和销毁都使用这个全局变量

3.销毁session可以通过session_destroy()进行

注意:不session_start()开启会话,sessionid是不会产生的,即session就不能正常运行!

4、session文件的存储位置

打开php.ini文件,搜索session,找到session.save_path ="E:/wamp64/tmp",说明session生成的文件保存在E:/wamp64/tmp目录下,以sess_sessionId格式的文件名,sessionId保存在cookie中!

public function test () {
        session_start();
        $_SESSION['name'] = 'sunshine';
        $_SESSION['age'] = 26;
        $_SESSION['email'] = 'virus_yue@163.com';
        dump($_SESSION);
          dump('SESSION的名字:'.session_name());
        echo '<br />';
        dump('session的ID:'.session_id());
    }

//运行结果:
array:3 [▼
  "name" => "sunshine"
  "age" => 26
  "email" => "virus_yue@163.com"
]

"SESSION的名字:PHPSESSID"


"session的ID:8brcdq87ijrhtolv26hfv7ted1"

运行此程序后,打开tmp目录下的session文件,内容如下:

name|s:8:"sunshine";age|i:26;email|s:17:"virus_yue@163.com";


5、设置session的生存周期

注意:由于生成的sessionId保存在cookie里,没有设置cookie时间的!相当于一个会话,关闭浏览器后,cookie中的数据就会失效,所以,一旦关闭浏览器,session中数据也将丢失!

因此,我们需要设置session的过期时间,即设置cookie的过期时间!!!

public function test1(){
        session_start();
        $_SESSION['username'] = 'sunshine';
        $_SESSION['email'] = 'virus_yue@163.com';
        setcookie(session_name(), session_id(), time()+3600);
        dump($_SESSION);
    }
6、session数据的两种保存方式
public function test () {
        session_start();
        $_SESSION['name'] = 'sunshine';//保存方式1
        $_SESSION['age'] = 26;
        $_SESSION['email'] = 'virus_yue@163.com';
        dump($_SESSION);
        dump('SESSION的名字:'.session_name());
        echo '<br />';
        dump('session的ID:'.session_id());
    }

运行结果:
  array:3 [▼
  "name" => "sunshine"
  "age" => 26
  "email" => "virus_yue@163.com"
]

"SESSION的名字:PHPSESSID"


"session的ID:8brcdq87ijrhtolv26hfv7ted1"

------------------------------------------------------------------------------------
public function test1(){
        session_start();
        $userlist = [
            ['id'=>1, 'username'=>'test1', 'email1'=>'111111@qq.com'],
            ['id'=>2, 'username'=>'test2', 'email1'=>'222222@qq.com'],
            ['id'=>3, 'username'=>'test3', 'email1'=>'333333@qq.com'],
            ['id'=>4, 'username'=>'test4', 'email1'=>'444444@qq.com'],
        ];
        $_SESSION = $userlist;//保存方式2——保存数组
        dump($_SESSION);
    }

运行结果:
  array:4 [▼
  0 => array:3 [▼
    "id" => 1
    "username" => "test1"
    "email1" => "111111@qq.com"
  ]
  1 => array:3 [▼
    "id" => 2
    "username" => "test2"
    "email1" => "222222@qq.com"
  ]
  2 => array:3 [▼
    "id" => 3
    "username" => "test3"
    "email1" => "333333@qq.com"
  ]
  3 => array:3 [▼
    "id" => 4
    "username" => "test4"
    "email1" => "444444@qq.com"
  ]
]
7、当用户禁用掉cookie后,session还可以使用吗?

如果用户手动禁用cookie,sessionId是传不过去的,这样session就不可以用了!但是,我们可以把sessionId附着在地址栏上,这样还是可以用的!但是不推荐使用,还是在cookie里传递!

8、销毁session

1、将$_SESSION清空,即赋予SESSION=[];

2、判断session是否通过cookie传递ini_get('session.use_cookies'),若是将cookie中的数据清除 setcookie()

3、通过session_destroy()销毁会话

例子:

public function test2(){
        session_start();
        //1.$_SESSION清空
        $_SESSION = [];
        //2.删除会话cookie
        if (ini_get('session.use_cookies')) {
            $params = session_get_cookie_params();//设置cookie的参数
            setcookie(session_name(), '', time()-1, $params['path'],$params['domain'],$params['secure'],$params['httponly']);
        }
        //3、session_destroy()销毁session
        session_destroy();
    }