zoukankan      html  css  js  c++  java
  • php Session配置

    php中的Session是什么

    Session会话是存储在服务器端的,相对比较安全,也并不像 Cookie 那样有存储长度的限制。

    Session 工作原理

    当启动一个 Session 会话时,会生成一个随机且唯一的 Session_id, 也就是 Session的文件名,此时 Session_id 存储在服务器的内存中。当关闭页面是此 id 会自动注销,重新登录此页面,会再次生成一个随机且唯一的 id。

    Session的功能

    Session 在 Web 技术中非常重要。例如,在电子商务网站中,通过 Session 记录用户登陆的信息,以及用户所购买的商品,如果没有 Session,那么用户每进入一个页面都需要登陆一次用户名和密码。

    另外, Session 会话适用于存储信息量比较少的情况。 如果用户需要存储的信息量相对较少,并且对存储内容不需要长期存储,那么使用 Session 把信息存储到服务器端比较合适。

    php中如何配置Session

    cookir的问题:用户有权阻止 Cookie 使用,使 Web 服务器无法通过 Cookie 来跟踪用户信息。而 Session 技术是将使用者相关的资料存放在服务器系统之下,所以使用者无法停止 Session 的使用。

    php.ini设置参考项:
    
    1. 处理session存取的模式
    
    session.save_handler = files
    
    2. session档案存放路径
    
    session.save_path = /tmp
    
    3. session使用cookie的功能,启动: 1
    
    session.use_cookies = 1
    
    4. session名字
    
    session.name = PHPSESSID
    
    5. 自动启动;0:关;1:开启
    
    session.auto_start = 0
    
    6. session使用cookie的生存期,以秒为单位
    
    session.cookie_lifetime = 0
    
    7. cookie有效作用域名
    
    session.cookie_domain = "a.com"
    
    8. 概率是 session.gc_probability/session.gc_divisor 结果 1/1000;不建议设置过小,因为session的垃圾回收,是需要检查每个文件是否过期的
    
    session.gc_probability = 1
    
    session.gc_divisor = 1000
    
    9. 过期时间 默认24分钟
    
    session.gc_maxlifetime = 1440

    php中如何启动Session会话

    Session 的设置与 Cookie 不同,必须先行启动,在PHP中必须调用 session_start()函数,以便让 PHP 核心程序将和 Session相关的内建环境 变量预先载入到内存中。

    注意: 通常,session_start()函数在页面开始位置调用,然后会话变量被登录到数据 $_SESSION。

    说明:如果使用基于 Cookie 的 Session,在使用该函数开启 Session之前,不能有任何输出的内容。因为基于 Cookie 的 Session 实在开启的时候,调用 session_start()函数生成唯一的一个 Session ID,需要保存在客户端计算机的 Cookie 中,所以使用 session_start()函数之前浏览器不能有任何输出,即使是空格和空行也不行,否则会产生输出字符串产生的错误。

    如果不想在每个脚本中都使用 session_start()函数 来开启 Session,可以在 php.ini 里面设置 session.auto_start = 1,就不需要每次使用 Session 之前都要调用 session_start()函数。但启用这个选项也是有一些限制的,就是不能将对象放入 Session 中,因为类定义必须在启动 Session 之前加载。 所以一般不建议使用session.auto_start来开启 Session。

    php中如何注册和读取Session会话

    注册Session会话

    <?php
    
      session_start();                            // 启动 Session
    
      $_SESSION['name'] = null;                   // 声明一个名为 name 的变量,并设置为空值 null。
    
    ?>

    读取Session会话

    例如:判断存储用户名的 Session 会话变量是否为空,如果不为空,则将该会话变量赋予 $my_value,其代码显示如下:

    <?php
    
      if(!empty($_SESSION['session_name'])){       //判断存储用户名的  Session 会话变量是否为空
    
        $my_value = $_SESSION['session_name'];     //将会话变量赋予一个变量 $my_value
    
      }
    
    ?>

    php中如何删除和销毁Session

    当使用完一个 Session 变量后,可以将其删除;当完成一个会话以后,也可以将其销毁。如果用户想退出 Web 系统,就需要为他提供一个注销的功能,把他的所有信息在服务器中销毁。

    (1)删除单个会话

    删除单个会话即删除单个会话的变量、同数组的操作一样,直接注销 $_SESSION 数组 的某个元素即可。

    例如: $_SESSION['user']变量,可以使用 unset()函数,代码如下所示:

    unset( $_SESSION['user']);

    注意: 使用 unset()函数时,要注意 $_SESSION 数组中元素不能省略,即不可以一次注销整个数组,这样会禁止整个会话的功能,如 unset($_SESSION)函数会将全局变量 $_SESSION 销毁,而且没有办法将其回复,用户也不能再注册 $_SESSION 变量。

    (2)删除多个会话

    如果想把某个用户在 Session 中注册的所有变量都删除,也就是删除多个会话即一次注销所有的会话变量,可以通过将一个空的数组赋值给 $_SESSION来实现,其代码显示如下:

    $_SESSION = array();

    (3)结束当前会话

    如果整个会话已经结束,首先应该注销所有会话变量,然后使用 session_destroy()函数清除结束当前的会话,并清空会话中的所有资源,彻底销毁Session,其代码如下显示:

    session_destroy();

    下面将通过一个实例,提供完整的代码,运行该脚本后就可以关闭 Session,并销毁与本次会话有关的所有资源。

    <?php
    
    //开启session
    session_start();
    //删除所有session变量
    $_SESSION = array();
    //判断cookie中是否存在session id
    if(isset($_COOKIE[session_name()])){
        setcookie(session_name(),'',time()-3600,'/');
    }
    //彻底销毁session
    session_destroy();

    php中Session的自动回收机制详解

    一般情况下,可以通过在页面提供的一个“退出” 按钮,单击来销毁本次会话。但是用户如果没有点击退出按钮,而是直接关闭浏览器,或者断网,或者断电直接关闭计算机等情况下,在服务器端保存的 Session 文件是不会被删除的。虽然关闭了浏览器,下次需要分配一个新的 Session ID 重新登录,但这只是因为在 php.ini 中的设置 session.cookie_lifetime = 0, 来设定 Session ID 在客户端 Cookie 中的有效期限,以秒为单位指定了发送到浏览器的 Cookie 的生命周期。值为0 表示 “直到关闭浏览器”,默认为 0.

    当系统赋予 Session 有效期限后,不管浏览器是否开启,Session ID 都会自动消失。而客户端的 Session ID 消失,服务端保存的 Session 文件并没有被删除。所以没有被 Session ID 引用 的服务器端 Session 文件,就成为 “ 垃圾 ”。 为了防止这些垃圾 Session 文件对系统造成过大的负荷(因为 Session 并不像 Cookie 是一种半永久性的存在), 对于永远也用不上的 Session 文件(垃圾文件),系统有自动清理的机制。

    “ 垃圾回收程序 ” 是什么样的启动机制呢?

    “ 垃圾回收程序 ” 是在调用 session_start()函数时启动的。 而一个网站有多个脚本,每个脚本又都要使用 session_start()函数开启会话,又会有很多个用户同时访问,这就很有可能使得 session_start()函数在 1秒内被调用了 N 次,而如果每次都会启动 “ 垃圾回收程序 ” ,这样就很不合理了。即使最少控制在 15分钟以上启动一次 “ 垃圾回收程序 ” ,一天也要清理 100多次,这样太频繁了。 通过在 php.ini 文件中修改 session.gc_probability 和 session.gc_divisor 两个选项,设置启动垃圾回收程序的概率。系统会根据session.gc_probability/session.gc_divisor 公式计算概率,例如选项 session.gc_probability = 1,选项 session.gc_divisor = 100,这样概率就变成了 1/100,也就是 session_start()函数被调用 100 次才会启动一次 “ 垃圾回收程序 ” 。所以对会话页面访问越频繁,启动的概率就越来越小。一般的建议为 调用1000-5000次才会启动一次: 1/(1000~5000)。

    php中如何传递Session ID

    1.通过 Cookie 来传递 Session ID

    如果客户端没有禁止 Cookie,则在 PHP脚本中通过 session_start()函数进行初始化后,服务器会自动发送 HTTP 标头将 Session ID 保存到客户端计算机的 Cookie 中。

    2. 通过 URL 来传递 Session ID

    如果客户端浏览器支持 Cookie,就把 Session ID 作为 Cookie 保存在浏览器中。但如果用户禁止 Cookie 的使用,则浏览器中就不存在作为 Cookie 的 Session ID,因此在客户端请求中不包含 Cookie 信息。

    在 PHP 中提供了跟踪 Session 的另一种机制,如果客户端浏览器不支持 Cookie,则 PHP 可以重写客户端请求 URL,把Session ID 添加到 URL 中。可以手动在每个超链接的 URL 中都添加一个 Session ID,这种方法工作量比较大,一般不建议使用这种方式。其示例的代码如下所示:

    <?php
    
    //开启 session
    
    session_start();
    
    // 在 URL 后面附加参数,变量名为session_name()获取的名称,值为session_id()获取
    
    echo '<a href="test.php?'.session_name().'='.session_id().'">演示</a>';
    
    ?>
  • 相关阅读:
    大话设计模式——UML图
    IdentityServer3零星笔记
    Angular路由
    基于jquery的静态页面翻页
    00_python安装与配置(mac)
    OracleParameter.UdtTypeName的值必须是全大写!
    VS2012调用64位IIS Express
    MVC中使用Ueditor
    优秀博客站点
    jqGrid中的formatter
  • 原文地址:https://www.cnblogs.com/chenyingying0/p/12963909.html
Copyright © 2011-2022 走看看