ThinkPHP 3.2.3 中设置和使用 Session

Session 的配置

可以在 config.php(可以是应用公用的 config.php 或模块的 config.php)中对 Session 进行配置,例如:

config.php

<?php
return array(
    //‘配置项‘=>‘配置值‘
    ‘SESSION_AUTO_START‘ =>false,//系统不自动启动Session
    ‘SESSION_OPTIONS‘=>array(
        ‘use_trans_sid‘=>1,
        ‘expire‘=>3600,//设置过期时间session.gc_maxlifetime的值为1小时
    )
);

其中默认情况下,初始化之后系统会自动启动 Session,也就是 session.auto_start = 1。可以取消 Session 的自动启动,因为虽然如果开启了此选项,每次使用 Session 的时候无需调用 session_start(),但是由于不能将对象放入 Session,因为类定义必须在启动 Session 之前加载。闭自动启动后可以项目的公共文件或者在控制器中通过手动调用 session_start() 或者 session(‘[start]‘) 启动 session。

可以在配置文件的 ‘SESSION_OPTIONS‘ 中进行配置的选项有:

参数名 说明
id session_id值
name session_name 值
path session_save_path 值
prefix session 本地化空间前缀
expire session.gc_maxlifetime 设置值
domain session.cookie_domain 设置值
use_cookies session.use_cookies 设置值
use_trans_sid session.use_trans_sid 设置值
type session处理类型,支持驱动扩展

系统还提供了 Session 管理和操作的完善支持,全部操作可以通过一个内置的 session 函数完成,该函数可以完成 Session 的设置、获取、删除和管理操作。

如果 session 方法的第一个参数传入数组则表示进行 session 初始化设置,上面通过在 config.php 中进行的配置用内置的 session 函数可以达到相同的效果:

session(array(‘use_trans_sid‘=>1,‘expire‘=>3600));    

注意:使用该种方式设置 Session 参数时,需要把该方法写在 session_start() 函数之前(如果 Session 没有设置为自动开启)。

Session 的使用

系统提供了Session 管理和操作的完善支持,全部操作可以通过一个内置的 session 函数完成,该函数可以完成Session的设置、获取、删除和管理操作。

session 函数位于 \ThinkPHP\Conmon\functions.php 内,源码:

  1 /**
  2  * session管理函数
  3  * @param string|array $name session名称 如果为数组则表示进行session设置
  4  * @param mixed $value session值
  5  * @return mixed
  6  */
  7 function session($name=‘‘,$value=‘‘) {
  8     $prefix   =  C(‘SESSION_PREFIX‘);
  9     if(is_array($name)) { // session初始化 在session_start 之前调用
 10         if(isset($name[‘prefix‘])) C(‘SESSION_PREFIX‘,$name[‘prefix‘]);
 11         if(C(‘VAR_SESSION_ID‘) && isset($_REQUEST[C(‘VAR_SESSION_ID‘)])){
 12             session_id($_REQUEST[C(‘VAR_SESSION_ID‘)]);
 13         }elseif(isset($name[‘id‘])) {
 14             session_id($name[‘id‘]);
 15         }
 16         if(‘common‘ == APP_MODE){ // 其它模式可能不支持
 17             ini_set(‘session.auto_start‘, 0);
 18         }
 19         if(isset($name[‘name‘]))            session_name($name[‘name‘]);
 20         if(isset($name[‘path‘]))            session_save_path($name[‘path‘]);
 21         if(isset($name[‘domain‘]))          ini_set(‘session.cookie_domain‘, $name[‘domain‘]);
 22         if(isset($name[‘expire‘]))          {
 23             ini_set(‘session.gc_maxlifetime‘,   $name[‘expire‘]);
 24             ini_set(‘session.cookie_lifetime‘,  $name[‘expire‘]);
 25         }
 26         if(isset($name[‘use_trans_sid‘]))   ini_set(‘session.use_trans_sid‘, $name[‘use_trans_sid‘]?1:0);
 27         if(isset($name[‘use_cookies‘]))     ini_set(‘session.use_cookies‘, $name[‘use_cookies‘]?1:0);
 28         if(isset($name[‘cache_limiter‘]))   session_cache_limiter($name[‘cache_limiter‘]);
 29         if(isset($name[‘cache_expire‘]))    session_cache_expire($name[‘cache_expire‘]);
 30         if(isset($name[‘type‘]))            C(‘SESSION_TYPE‘,$name[‘type‘]);
 31         if(C(‘SESSION_TYPE‘)) { // 读取session驱动
 32             $type   =   C(‘SESSION_TYPE‘);
 33             $class  =   strpos($type,‘\\‘)? $type : ‘Think\\Session\\Driver\\‘. ucwords(strtolower($type));
 34             $hander =   new $class();
 35             session_set_save_handler(
 36                 array(&$hander,"open"),
 37                 array(&$hander,"close"),
 38                 array(&$hander,"read"),
 39                 array(&$hander,"write"),
 40                 array(&$hander,"destroy"),
 41                 array(&$hander,"gc"));
 42         }
 43         // 启动session
 44         if(C(‘SESSION_AUTO_START‘))  session_start();
 45     }elseif(‘‘ === $value){
 46         if(‘‘===$name){
 47             // 获取全部的session
 48             return $prefix ? $_SESSION[$prefix] : $_SESSION;
 49         }elseif(0===strpos($name,‘[‘)) { // session 操作
 50             if(‘[pause]‘==$name){ // 暂停session
 51                 session_write_close();
 52             }elseif(‘[start]‘==$name){ // 启动session
 53                 session_start();
 54             }elseif(‘[destroy]‘==$name){ // 销毁session
 55                 $_SESSION =  array();
 56                 session_unset();
 57                 session_destroy();
 58             }elseif(‘[regenerate]‘==$name){ // 重新生成id
 59                 session_regenerate_id();
 60             }
 61         }elseif(0===strpos($name,‘?‘)){ // 检查session
 62             $name   =  substr($name,1);
 63             if(strpos($name,‘.‘)){ // 支持数组
 64                 list($name1,$name2) =   explode(‘.‘,$name);
 65                 return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
 66             }else{
 67                 return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
 68             }
 69         }elseif(is_null($name)){ // 清空session
 70             if($prefix) {
 71                 unset($_SESSION[$prefix]);
 72             }else{
 73                 $_SESSION = array();
 74             }
 75         }elseif($prefix){ // 获取session
 76             if(strpos($name,‘.‘)){
 77                 list($name1,$name2) =   explode(‘.‘,$name);
 78                 return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;
 79             }else{
 80                 return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;
 81             }
 82         }else{
 83             if(strpos($name,‘.‘)){
 84                 list($name1,$name2) =   explode(‘.‘,$name);
 85                 return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;
 86             }else{
 87                 return isset($_SESSION[$name])?$_SESSION[$name]:null;
 88             }
 89         }
 90     }elseif(is_null($value)){ // 删除session
 91         if(strpos($name,‘.‘)){
 92             list($name1,$name2) =   explode(‘.‘,$name);
 93             if($prefix){
 94                 unset($_SESSION[$prefix][$name1][$name2]);
 95             }else{
 96                 unset($_SESSION[$name1][$name2]);
 97             }
 98         }else{
 99             if($prefix){
100                 unset($_SESSION[$prefix][$name]);
101             }else{
102                 unset($_SESSION[$name]);
103             }
104         }
105     }else{ // 设置session
106         if(strpos($name,‘.‘)){
107             list($name1,$name2) =   explode(‘.‘,$name);
108             if($prefix){
109                 $_SESSION[$prefix][$name1][$name2]   =  $value;
110             }else{
111                 $_SESSION[$name1][$name2]  =  $value;
112             }
113         }else{
114             if($prefix){
115                 $_SESSION[$prefix][$name]   =  $value;
116             }else{
117                 $_SESSION[$name]  =  $value;
118             }
119         }
120     }
121     return null;
122 } 

分析该方法的源码:

Line:9 如果 session() 的第一个参数是数组的话,则是配置 Session

Line:10 如果该数组中包含表示前缀的 prefix 参数,则把该参数写入配置

Line:11 如果配置中包含表示 Session ID 的选项 VAR_SESSION_ID 并且存在通过 GET、POST 或 COOKIE 传递来的配置中 VAR_SESSION_ID 的值,则把 Session ID 设置为传递近来的配置中 VAR_SESSION_ID 的值;如果数组中含有 id,则把 Session ID 设置为 id。这两种方式都是用来手动设置 Session ID,例如在 PHP 脚本中设置

session(array(‘id‘=>‘set_session_id_manual‘));    

则打印 session_id() 函数就会得到手动设置的 set_session_id_manual 的值

Line:16 如果 APP_MODE 等于 common 时,设置 session 不自动启动。APP_MODE 的常量在框架入口文件 ThinlPHP/ThinkPHP.php 中设置,表示应用模式,默认为普通模式。由于 ThinkPHP 的系统流程是先载入框架入口文件 ThinkPHP.php,再加载惯例配置文件(普通模式是)ThinkPHP/Conf/convention.php,最后加载应用配置文件(普通模式是)Application/Common/Conf/config.php。所以在默认情况下惯例配置文件中的设置

‘SESSION_AUTO_START‘    =>  true

会覆盖框架入口文件中的

ini_set(‘session.auto_start‘, 0);

也就是说在 ThinkPHP 3.2.3 中,默认情况下,Session 是自动开启的,不需要每次使用 Session 的时候调用 session_start() 函数。 

Line:19 - 30 当参数数组中含有 name、path、domain、expire、use_trans_sid、use_cookies、cache_limiter、cache_expire、type 等值时分别对 session_name、session_save_path、session_cache_limiter、session_cache_expire 等函数进行赋值或者 php.ini 中的相应参数 session.cookie_domain、session.use_trans_sid、session.use_cookies、session.gc_maxlifetime、session.cookie_lifetime 进行设置。

Line:31 - 42 读取 Session 驱动。如果没有采取默认的文件存储 Session 的方式,例如在 config.php 中配置了

<?php
return array(
    ‘SESSION_TYPE‘=>‘Db‘
);

那么就会自动加载 ThinkPHP/Library/Think/Session/Driver/Db.class.php,使用 Db 的方式来存储 Session。

Line:44 如果配置中 SESSION_AUTO_START 的值为 True,则开启 Session:session_start()

Line:45 当 session() 的第二个参数为 ‘‘ 时,表示 Session 的取值

$username= session(‘username‘);

Line:46 当 session() 的一个参数也为 ‘‘ 时,即是获取全部的 session

return $prefix ? $_SESSION[$prefix] : $_SESSION;

这是 3.2.3 版本增加的获取所有 session 的方法:

$session_info = session();

Line:49 Session 操作

Line:61 检查 Session

3.2.3 版本新增加的功能,支持二维数组取值,例如

$uid = session(‘user.uid‘);

Line:69 清空 Session

Line:90 删除 Session,例如

session(‘username‘,null); // 删除username

3.2.3 版本开始支持删除二维数组:

session(‘user.uid‘,null); // 删除session

Line:105 Session 的赋值,例如

session(‘username‘,‘dee‘);  //设置session

3.2.3 版本开始,session 赋值操作支持二维:

session(‘user.uid‘,10);  //设置session

附:ThinkPHP 框架的惯例配置在 ThinkPHP/Conf/convention.php

和 Session 相关的配置有:

    /* SESSION设置 */
    ‘SESSION_AUTO_START‘    =>  true,    // 是否自动开启Session
    ‘SESSION_OPTIONS‘       =>  array(), // session 配置数组 支持type name id path expire domain 等参数
    ‘SESSION_TYPE‘          =>  ‘‘, // session hander类型 默认无需设置 除非扩展了session hander驱动
    ‘SESSION_PREFIX‘        =>  ‘‘, // session 前缀
    //‘VAR_SESSION_ID‘      =>  ‘session_id‘,     //sessionID的提交变量

参考:http://www.kancloud.cn/manual/thinkphp/1872

时间: 2024-10-18 15:38:21

ThinkPHP 3.2.3 中设置和使用 Session的相关文章

ThinkPHP 3.2.2中使用define(&#39;BUILD_CONTROLLER_LIST&#39;,&#39;Index,User,Menu&#39;)无法生成相应控制器

笔者最近在学习ThinkPHP框架,按照官方开发手册,在架构一节中,按照手册,绑定Admin模块却无法生成相应的文件. <?define('BIND_MODULE','Admin'); // 绑定Admin模块,如果没有则生成该模块define('BUILD_CONTROLLER_LIST','Index,User,Menu');//生成InderxContoller,UserController,MenuControllerdefine('BUILD_MODEL_LIST','User,Men

Asp.Net Core 如何在 IIS 中设置环境变量

当运行一个 Asp.Net Core 应用的时候, WebHostBuilder 根据环境变量来判断当前运行的是哪个环境,可能是 Development,Staging或者Production.你也可以设置成随便的一个字符串. 这个链接将会告诉你 如何在各种平台各种环境中设置环境变量.但如果你使用 IIS来代理 Asp.Net Core.你需要在 web.config 中设置环境变量 <configuration> <system.webServer> <handlers&g

Linux中设置服务自启动的三种方式

有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务 主要用三种方式进行这一操作: ln -s                       在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0-6七个运行级别之一) chkonfig                命令行运行级别设置 ntsysv                   伪图形运行级别设置 注意:1.这三种方式主要用于以redhat为基础的发行版 2.如果还不知道运行级别是什么,那么最

JSP中设置超链接失效点击进入下载页面的问题

在JSP中设置超链接标签体后点击发现进入不了页面而是进入了下载页面,此时需要在你新建的超链接对应的Servlet中查看response响应头是否有设置,设置是否成功,如下代码: 在JSP页面设置如下超链接发现进入不了, <a href="<%= request.getContextPath()%>/servlet/BuyServlet?prod=电视">电视</a><br> 此时进入BuyServlet类中查看response的应答头的设

QT模态对话框用法(在UI文件中设置Widget背景图,这个图是一个带阴影边框的图片——酷)

QT弹出模态对话框做法: 1.新建UI文件时,一定要选择基类是QDialog的,我的选择是:Dialog without Buttons(),如下图: 2.然后在使用的时候: MyDialog dlg(this); dlg.exec(); 如果不加this,则会在任务管理器里面产生一个新的EXE. 3.如果对话框的标题是自定义,不想使用系统的标题,这时候需要在代码中加入: setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint ); setAttr

在Maven中设置Nexus私有服务为中央工厂

在Maven中设置Nexus私有服务为中央工厂(repository) 2015-12-12 17:45 168人阅读 评论(0) 收藏 举报  分类: Maven(17)  版权声明:本文为博主原创文章,未经博主允许不得转载. nexus中的仓库列表 第一种方式: <repositories>  <repository>  <id>nexus</id>  <name>nexus Repository</name>  <url&

在storyboard中设置控件的layerbordercolor

在SB中控件可以在SB中直接利用kvc 设置一些属性值,不如layerwidth等 但是不能更改和颜色有关的属性因为layerbordercolor是CGColor.通过为CALayer增加属性可以实现在SB中也能用KVC设置layerbordercolor;新建CALayer的分类(代码参考网上) @interface CALayer (WjlCALayer) /** * 在SB中设置keypath就可以改变boredercolor的颜色 */ @property(nonatomic, str

【转】Android中设置TextView的颜色setTextColor

原文网址:http://www.cnblogs.com/myphoebe/archive/2012/01/06/2314728.html android中设置TextView的颜色有方法setTextColor,这个方法被重载了,可以传入两种参数. public void setTextColor(int color) { mTextColor = ColorStateList.valueOf(color); updateTextColors(); } public void setTextCo

HTML中设置背景图的两种方式

HTML中设置背景图的两种方式 1.background    background:url(images/search.png) no-repeat top; 2.background-image    background-image:url(images/search.png):    background-repeat:no-repeat;