• http协议。会话控制cookie、session


    http协议是无状态的协议。每次访问页面的http协议都是独立的,正是因为http协议是无状态的,所以导致访问一个页面后再去访问另一个页面的时候,一些数据会消失,比如:用户的登录信息就会消失。那么怎么才能使用户的信息不消失呢?就是使用会话控制。

      当然除了会话控制,有没有什么方法让变量在不同的页面之中都有效。答:有
    (1)通过get或post方式从一个页面中传到另一个页面中(只适合传输数据量小的,数据量变大就不合适了)
    (2)可以把变量先存储到数据库中,或者使用file_put_content()写入文件中,然后在其他页面使用file_get_content()读取(但是缺点是所有用户共用文件中的数据,如果想要跟踪用户的登录信息,这种做法是            非常不可取的)

    (3)cookie技术,是把用户的信息存储到用户自己的电脑里的一个文件中(方法2中是把数据写在服务器的文件中),在设置cookie的那个页面中是不能获取到cookie中的信息的,就是说在设置cookie的页面            中echo  $_COOKIE是 没有数据的。

    这样该用户在访问一个网站不同的页面的时候,他的登录信息就可以实现跟踪。  setCookie()设置cookie,,,注意:setCookie之前不能有任何的输出(像echo,print_r等等)。否则会报错。(提一下,基本上头信息之前都不能有输出,比如header)

      2.session:上面说了cookie是把数据存在客户端的文件,而程序是不能操作客户端的数据的并且用户是可以阻止cookie的(不用cookie存储 数据),数据存在客户端也是不安全的。这个时候session就出现了,session是把数据存在服务器端的文件中(数据库、redis都行)。但是用户有很多,比如张三、李四,怎么找到张三的信息呢?就是session_id,在使用session的时候,每个用户会得到一个唯一的session_id,以后每次张三登录的时候,就可以凭借session_id去调用存在session中数据信息。   session_id的存储有两种: 一种是基于cookie,就是存到cookie中;第二种,通过URL传输session_id。

      (2)session_start()开启之前不能有任何输出,还有就是     <?php   之前不能有空格、空行,他也相当于是输出。session_start有两个作用,一是创建session_id,当你第一次开启session,他会创建session_id保存到cookie中(可以使用$_COOKIE查看);二是当已经分配session_id情况下,session_start就不在创建新的ID,而是用之前的ID来开启会话。

      (3)开启session方式:1.每个页面必须都有session_start才行,2.或者通过修改配置文件,那么就不用每个页面都写session_start(),但是修改配置文件的方式会导致session不能存储对象。所以不建议使用配置文件的方式自动开启session。(https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=2169381799,1320776160&fm=173&app=49&f=JPEG?w=450&h=300&s=440A5532435E4DC80AD4B1DB0000C0B2

     清空session超全局数组中的值

      如果想把某个用户在Session中注册的所有变量都删除,可以直接将数组变量$_session赋上一个空数组:

    $_SESSION=array();                //将Session中变量全部清除

    注意:使用"$_SESSION=array()" 清空$_SESSION数组,不会释放session_id。而使用session_destroy()时,则是将这个用户在服务器端对应的Session文件删除,同时释放session_id,但内存中的$_SESSION变量内容依然保留。

    谈一谈session_unset()和session_destroy()以及unset()的区别

    创建a.php ,b.php ,c.php三个文件测试区别。在php.ini配置文件中找到session文件保存的路径。刚开始是没有session文件的,如图:

    开启session会话,往$_SESSION数组中写入值。可以看到创建了session文件,并且打印输出$_SESSION如图:

    首先使用session_unset(),他只是清空了$_SESSION数组中的值,但是不会删除session文件,不会释放session_id; $_SESSION变量也存在(个人认为和清空数组一样的效果)。结果如图

        ----------->>>>>> session文件还存在

    接下来是session_destroy(),会将文件删除,释放session_id。但是不会删除内存中的变量。结果如图:

     文件也不存在了,如下图:

    注意提示的错误信息,仍然是未定义的索引。   接下来是unset()。重新开启session,unset()删除$_SESSION。结果如图:

    能够发现unset把内存中的变量$_SESSION删除了,但是文件仍然存在(这里不截图了),session_id也存在 。(值得注意的是,unset在c.php中删除变量的话,在b.php中打印$_SESSION仍然存在值

     下面是测试代码:

    //a.php  文件代码
    
    <?php
    session_start();
    $_SESSION['name'] = 'name';
    $_SESSION['age'] = 20;
    
    //b.php
    
    <?php
    
    session_start();
    // session_unset();
    echo $_SESSION['name'];
    echo '<br>';
    // $_SESSION = [];
    // print_r($_SESSION);
    // session_destroy();
    echo session_id();
    // session_unset();
    // unset($_SESSION);
    
    //c.php
    <?php
    session_start();
    unset($_SESSION);
    // session_unset();
    var_dump($_SESSION);
    echo '<br>';
    echo $_SESSION['age'];
    echo '<br>';
    echo session_id();

     引用 “Aileen0509”  的回答中一段话,原文点这里

    session_destroy() ,手册中明确的说道:destroys all of the data associated with the current session. It does not unset any of the global variables associated with the session, or unset the session cookie. To use the session variables again, session_start() has to be called.
    不会删除 session 的全局变量和 session相关cookie,只是结束了这次会话。作为一个普普通通的全局变量,如果我们不需要了的话,就将他 unset() 掉。如果想再次开启会话,就需要再一次session_start(),但是session_start() 重新建立会话,会重新初始化$_SESSION数组,session_start()之后$_SESSION 就又是一个空数组了。

  • 相关阅读:
    art-template学习(一)之特性和安装
    Velocity学习(四)之判断是否为空以及为什么要使用{}来明确标识变量
    Velocity学习(三)之 ${} 和$!{}、!${}区别
    sqlcode、sqlerrm
    批量删除存储过程
    cursor 与refcursor及sys_refcursor的区别 (转载)
    分享最近写的几个存储过程
    中国人寿数据库死锁处理
    合理计划 dictionary cache 大小
    表空间、数据文件对应关系
  • 原文地址:https://www.cnblogs.com/bneglect/p/10261063.html
Copyright © 2020-2023  润新知