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 内,源码:
/**
* session管理函数
* @param string|array $name session名称 如果为数组则表示进行session设置
* @param mixed $value session值
* @return mixed
*/
function session($name='',$value='') {
$prefix = C('SESSION_PREFIX');
if(is_array($name)) { // session初始化 在session_start 之前调用
if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']);
if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){
session_id($_REQUEST[C('VAR_SESSION_ID')]);
}elseif(isset($name['id'])) {
session_id($name['id']);
}
if('common' == APP_MODE){ // 其它模式可能不支持
ini_set('session.auto_start', 0);
}
if(isset($name['name'])) session_name($name['name']);
if(isset($name['path'])) session_save_path($name['path']);
if(isset($name['domain'])) ini_set('session.cookie_domain', $name['domain']);
if(isset($name['expire'])) {
ini_set('session.gc_maxlifetime', $name['expire']);
ini_set('session.cookie_lifetime', $name['expire']);
}
if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid', $name['use_trans_sid']?1:0);
if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0);
if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']);
if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']);
if(isset($name['type'])) C('SESSION_TYPE',$name['type']);
if(C('SESSION_TYPE')) { // 读取session驱动
$type = C('SESSION_TYPE');
$class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type));
$hander = new $class();
session_set_save_handler(
array(&$hander,"open"),
array(&$hander,"close"),
array(&$hander,"read"),
array(&$hander,"write"),
array(&$hander,"destroy"),
array(&$hander,"gc"));
}
// 启动session
if(C('SESSION_AUTO_START')) session_start();
}elseif('' === $value){
if(''===$name){
// 获取全部的session
return $prefix ? $_SESSION[$prefix] : $_SESSION;
}elseif(0===strpos($name,'[')) { // session 操作
if('[pause]'==$name){ // 暂停session
session_write_close();
}elseif('[start]'==$name){ // 启动session
session_start();
}elseif('[destroy]'==$name){ // 销毁session
$_SESSION = array();
session_unset();
session_destroy();
}elseif('[regenerate]'==$name){ // 重新生成id
session_regenerate_id();
}
}elseif(0===strpos($name,'?')){ // 检查session
$name = substr($name,1);
if(strpos($name,'.')){ // 支持数组
list($name1,$name2) = explode('.',$name);
return $prefix?isset($_SESSION[$prefix][$name1][$name2]):isset($_SESSION[$name1][$name2]);
}else{
return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]);
}
}elseif(is_null($name)){ // 清空session
if($prefix) {
unset($_SESSION[$prefix]);
}else{
$_SESSION = array();
}
}elseif($prefix){ // 获取session
if(strpos($name,'.')){
list($name1,$name2) = explode('.',$name);
return isset($_SESSION[$prefix][$name1][$name2])?$_SESSION[$prefix][$name1][$name2]:null;
}else{
return isset($_SESSION[$prefix][$name])?$_SESSION[$prefix][$name]:null;
}
}else{
if(strpos($name,'.')){
list($name1,$name2) = explode('.',$name);
return isset($_SESSION[$name1][$name2])?$_SESSION[$name1][$name2]:null;
}else{
return isset($_SESSION[$name])?$_SESSION[$name]:null;
}
}
}elseif(is_null($value)){ // 删除session
if(strpos($name,'.')){
list($name1,$name2) = explode('.',$name);
if($prefix){
unset($_SESSION[$prefix][$name1][$name2]);
}else{
unset($_SESSION[$name1][$name2]);
}
}else{
if($prefix){
unset($_SESSION[$prefix][$name]);
}else{
unset($_SESSION[$name]);
}
}
}else{ // 设置session
if(strpos($name,'.')){
list($name1,$name2) = explode('.',$name);
if($prefix){
$_SESSION[$prefix][$name1][$name2] = $value;
}else{
$_SESSION[$name1][$name2] = $value;
}
}else{
if($prefix){
$_SESSION[$prefix][$name] = $value;
}else{
$_SESSION[$name] = $value;
}
}
}
return null;
}
分析该方法的源码:
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
ThinkPHP 3.2.3 中设置和使用 Session的更多相关文章
- myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)
1.每次我们在MyEclispe中创建Jsp页面,生成的Jsp页面的默认编码是"ISO-8859-1".在这种情况下,当我们在页面中编写的内容存在中文的时候,就无法进行保存.如下图 ...
- 在 SharePoint Server 2016 本地环境中设置 OneDrive for Business
建议补丁 建议在sharepoint2016打上KB3127940补丁,补丁下载地址 https://support.microsoft.com/zh-cn/kb/3127940 当然不打,也可以用O ...
- C# Word中设置/更改文本方向
C# Word中设置/更改文本方向 一般情况下在Word中输入的文字都是横向的,今天给大家分享两种方法来设置/更改一个section内的所有文本的方向及部分文本的方向,有兴趣的朋友可以试下. 首先,从 ...
- label中设置某些指定的字体的属性设置(Color,Size,FontColor)
不知道大家有没有遇到要设置某些字体的颜色和大小等属性的设置,下面就让我们一起走进字体的变形王国吧!!! 1.在storyboard中拖一个控件label,拖线设置属性为: @property (wea ...
- Html中设置访问页面不在后进行其他页面跳转
Html中设置访问页面不在后进行其他页面跳转 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...
- GridView模版列中设置
在GridView模版列中设置如下<asp:TemplateField HeaderText="删除"> <ItemTemplate> ...
- jQuery中设置form表单中action的值的方法
下面介绍在jQuery中设置form表单中action的值的方法. $("#myFormId").attr("action", "userinfo.s ...
- 在linux中设置静态ip地址
在linux中设置静态ip地址1.在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.开始编辑,填写ip地址.子网掩码.网关.DNS等[root ...
- jQuery中设置form表单中action值与js有什么不同。。。。
jQuery中设置form表单中action值与js有什么不同.... HTML代码如下: <form action="" method="post" i ...
随机推荐
- checkbox 的全选与全不选
checkbox 的全选与全不选 只需要调用 cekAll.check();方法,这个方法接收两个参数: 参数一: 全选按钮的 id 以字符串的形式写 参数二: 其他 checkbox 的 name ...
- [转] Spring MVC sample application for downloading files
http://www.codejava.net/frameworks/spring/spring-mvc-sample-application-for-downloading-files n this ...
- mvn exec用法,运行jar后台驻留进程
java工程如果打包成war,那依赖的jar包都会被包含进去. 不过如果开发java的后台驻留进程,那一般会打包成jar包的形式,要想在运行进程的时候找到所有的依赖包,基本有如下两种方式: 方式一: ...
- ural 2062 Ambitious Experiment
2062. Ambitious Experiment Time limit: 3.0 secondMemory limit: 128 MB During several decades, scient ...
- 【SAP BO】【WEBI】【转】Webi实现动态选择度量
我们都知道Web Intelligence具有高级的分析功能,是一个非常灵活的报表工具.在这篇文章里,我会演示一个使用Webi实现动态选择度量对象的方案.首先解释一下什么是”动态选择度量”:例如我们有 ...
- 同引擎mysql数据库转导快
mysql数据库从一个表导入到另外一个表,数据库表引擎类型相同速度会快很多,相反,慢得离奇,5w,相同从myisam到myisam一或两分钟,从myisam到innodb要1到2个小时. [注意:最近 ...
- HDU 4454 Stealing a Cake(枚举角度)
题目链接 去年杭州现场赛的神题..枚举角度..精度也不用注意.. #include <iostream> #include <cstdio> #include <cstr ...
- linux修改系统编码
Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.一种方法是在windows进行转码,比如使用ue工具在文件-->转换 ...
- HDU-3549 最大流模板题
1.HDU-3549 Flow Problem 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 3.总结:模板题,参考了 http://ww ...
- Idea_Intellij Idea 12 生成serialVersionUID的方法
默认情况下Intellij IDEA是关闭了继承了java.io.Serializable的类生成serialVersionUID的警告.如果需要ide提示生成serialVersionUID,那么需 ...