解析php框架codeigniter中如何使用框架的session


Posted in PHP onJune 24, 2013

里面有两种session的使用方法:
1是php的原始的session使用方法,这个很简单,$_SESSION['name']="name",然后在需要的地方显示:echo $_SESSION['name'];
2是codeigniter这个框架的一个方法:
下面就详细讲解如何使用这个有点点复杂的方法:
首先,在\ci\application\config下面的config.php文件中找到:$config['encryption_key'] = '';这个里面随便填什么值都可以,但是不能为空。一般是英文啊,不要钻牛角尖。
接着在\ci\application\config下面的auto.php文件中找到:$autoload['libraries'] = array('');里面要填写:$autoload['libraries'] = array('session');或者在适当的地方如control文件夹里面的相应文件中(一般是在构造方法中)写:$this->load->library('session');这样也行。
现在环境配置好了,现在就是写代码了:
在需要放入session的地方写:
$this->session->set_userdata('name','yang');
这样session里面就有了值了。
显示值:
echo $this->session->userdata('name');
如果是array,则:
$newdata = array(
                   'username'  => 'johndoe',
                   'email'     => 'johndoe@some-site.com',
                   'logged_in' => TRUE
               );
$this->session->set_userdata($newdata);
以下是转载的别人的详细的有点废话的相关知识:
Sessions会在每个页面载入后开始运行,所以session类必须首先被初始化。

1、您可以在控制器中初始化,也可以在系统中自动加载(译者注:在autoload.php设定)$autoload['libraries'] = array('session');

2、要在您的控制器构造函数中初始化session类,您可以使用 $this->load->library 函数:$this->load->library('session');一旦被载入, session就可以这样使用: $this->session。
session类的绝大部分都会在后台运行,所以初始化session时,它session数据会被自动读取、创建和更新。

Sessions 是怎样工作的?
需要知道的非常重要的一点就是,session类一旦被初始化,它就会自动运行。对于后面的事情,您可以完全不作理会。正如您将会在下面看到的一样,您可以正常使用session来工作,甚至还可以添加自己的session数据,而在这一切的过程中,读、写和更新的操作都是自动完成的。

当页面载入后,session类就会检查用户的cookie中是否存在有效的session数据。如果session数据不存在(或者已经过期),那么就会创建一个新的session并把他保存在cookie中。如果session数据存在,那么他的信息就会被更新,同时cookie也会被同时更新。每次更新都会重新生成session_id的值。

默认情况下, Session Cookie 每隔 5 分钟才会更新一次,这样会减少对处理器的负荷。如果你重复的装载页面, 你会发现"上次活动"的时间在五分钟,或多余五分钟的时候才会变化,也就是 cookie上次被写入的时间。 这个时间可以通过设置 application/config/config.php 文件里的 $config['sess_time_to_update'] 行来改变。

一个 session 是由一个包括下列信息的数组组成的:
唯一的用户Session ID (这是一个平均信息量统计出来的非常坚固的随机字符串,使用MD5加密,默认是每五分钟就重新生成一次。
用户的 IP 地址
用户浏览器信息(取前50个字符)
最新的一个活跃时间戳.
以上数据将会用以下数组格式序列化并存到cookie里:

[array]
(
     'session_id'    => random hash,
     'ip_address'    => 'string - user IP address',
     'user_agent'    => 'string - user agent data',
     'last_activity' => timestamp
)

1、取得 Session 数据:
可以通过如下的函数来得到 session 数组的任何信息:
$this->session->userdata('item');
item 是数组里的相对应数据的索引。例如,想要获得 session ID, 你要使用如下的代码:
$session_id = $this->session->userdata('session_id');
注意: 如果你的目标数据不存在的话,这个函数会返回 FALSE (布尔值boolean)。

2、添加自定义的 Session 数据:
假设,有个特定用户登陆到你的网站, 当他通过检测后 你可以添加他的用户名和电子邮件到 session cookie 中,这些信息可以在不去访问数据库的情况下,当成全局量来使用。
通过以下函数,你可以传递一个新的用户数组到 session 数组中:
$this->session->set_userdata($array);
$array 是一个结合数组,用来存储你的新数据。例如 :

$newdata = array(
                   'username'  => 'johndoe',
                   'email'     => 'johndoe@some-site.com',
                   'logged_in' => TRUE
               );
$this->session->set_userdata($newdata);

如果使用下面 set_userdata()函数的写法,可以每次只添加一个用户数据。
$this->session->set_userdata('some_name', 'some_value');
注意: Cookies 只能存储 4KB 的数据, 使用时要小心超出它的容量。特别指出的是,加密会产生比原数据更长的数据字符串,所以一定要当心你要存放数据的大小。

3、删除 Session 数据:正如使用 set_userdata() 是用来添加信息到 session 中,而通过向unset_userdata() 函数中传递 session key 可以用来删除这些信息。例如, 你想要从 session 信息里去掉 'some_name':
$this->session->unset_userdata('some_name');
也可以给这个函数传一个要删除项的关联数组。
$array_items = array('username' => '', 'email' => '');
$this->session->unset_userdata($array_items);

4、将 Session 数据存入数据库:
当session 数据在数据库中可用时,每当从用户cookie中发现一个有效的session,一个数据库查询就会被执行以匹配它。如果 session ID 不相配,session 就会被销毁。Session ID永远不会更新,它们只会在一个新的会话创建时生成。
为了存储session,你必须先创建一个数据表。这是 session 类所需的基本结构(用于MySQL的):

CREATE TABLE IF NOT EXISTS `ci_sessions` ( 
session_id varchar(40) DEFAULT '0' NOT NULL, 
ip_address varchar(16) DEFAULT '0' NOT NULL, 
user_agent varchar(50) NOT NULL,
last_activity int(10) unsigned DEFAULT 0 NOT NULL,
user_data text DEFAULT '' NOT NULL, 
PRIMARY KEY (session_id) );

一旦启用了,Session类就会在数据库中存储session数据。
同时确保你已经在配置文件中指定了数据表名:$config['sess_table_name'] = 'ci_sessions';
注意: 默认情况下这个表叫做 ci_sessions, 但是你可以给它指定任意名字,只要你更新了 application/config/config.php 文件以确保它包含了你所起的名字。一旦你创建了数据表,你就可以像下面这样在config.php文件中启用数据库选项:
$config['sess_use_database'] = TRUE;
注意: Session类已经内置了清除过期session的垃圾回收机制,因此你不需要编写你自己的事务来做这个。

5、销毁 Session
要清除当前 session:$this->session->sess_destroy();
Session 的参数

6、你可以在application/config/config.php 文件中找到以下的 Session 相关的参数:
参数     默认     选项     描述
sess_cookie_name     ci_session     无     你想要保存 Session Cookie 的名字。
sess_expiration     7200     无     session 持续的秒数。默认是2个小时(7200秒)。如果将这个数值设为: 0,就可以得到 永久 session。
sess_expire_on_close     FALSE     TRUE/FALSE (boolean)     这个选项决定当浏览器窗口关闭时是否自动使session过期。
sess_encrypt_cookie     FALSE     TRUE/FALSE (布尔值boolean)     是否对 session 数据加密.
sess_use_database     FALSE     TRUE/FALSE (布尔值boolean)     是否将 session 数据存放入数据库中。在开启这个选项前,你要先创建一个数据库表。
sess_table_name     ci_sessions     任何有效的 SQL 表名     session 数据库表的名字。
sess_time_to_update     300     时间以秒计算     这个选项控制 session 类多久会产生一个新的session 和 session id。
sess_match_ip     FALSE     TRUE/FALSE (布尔值boolean)     是否通过用户的IP地址来读取 session 的数据。 注意 ,有些网络运行商 ISPs 会动态的改变IP, 所以将这个选项设为 FALSE, 才有可能得到永久的 session。
sess_match_useragent     TRUE     TRUE/FALSE (布尔值boolean)     是否要按照对应的 User Agent 来读取 session 数据。

PHP 相关文章推荐
可以在线执行PHP代码包装修正版
Mar 15 PHP
在php MYSQL中插入当前时间
Apr 06 PHP
Gregarius中文日期格式问题解决办法
Apr 22 PHP
一些使用频率比较高的php函数
Oct 03 PHP
php编写的简单页面跳转功能实现代码
Nov 27 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
php session的锁和并发
Jan 22 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
Oct 13 PHP
php array_walk_recursive 使用自定的函数处理数组中的每一个元素
Nov 16 PHP
php分页查询的简单实现代码
Mar 14 PHP
[原创]php实现数组按拼音顺序排序的方法
May 03 PHP
详解PHP如何更好的利用PHPstorm的自动提示
Aug 18 PHP
PHP错误提示的关闭方法详解
Jun 23 #PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
Jun 23 #PHP
关于zend studio 出现乱码问题的总结
Jun 23 #PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
Jun 23 #PHP
PHP获取MSN好友列表类的实现代码
Jun 23 #PHP
使用php统计字符串中中英文字符的个数
Jun 23 #PHP
php 获取本地IP代码
Jun 23 #PHP
You might like
php单件模式结合命令链模式使用说明
2008/09/07 PHP
通用PHP动态生成静态HTML网页的代码
2010/03/04 PHP
那些年一起学习的PHP(三)
2012/03/22 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
详解基于webpack2.x的vue2.x的多页面站点
2017/08/21 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
利用Angular7开发一个Radio组件的全过程
2019/07/11 Javascript
[01:29:31]VP VS VG Supermajor小组赛胜者组第二轮 BO3第一场 6.2
2018/06/03 DOTA
使用Python脚本操作MongoDB的教程
2015/04/16 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
python中子类继承父类的__init__方法实例
2016/12/15 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
python 检查文件mime类型的方法
2018/12/08 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
django使用admin站点上传图片的实例
2019/07/28 Python
人力资源部门的主要职能
2014/02/22 职场文书
国培计划培训感言
2014/03/11 职场文书
创业女性典型材料
2014/05/02 职场文书
鉴定评语大全
2014/05/05 职场文书
导师推荐信范文
2014/05/09 职场文书
学校读书活动总结
2014/06/30 职场文书
消防志愿者活动方案
2014/08/23 职场文书
挂职学习心得体会
2014/09/09 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python
JavaScript事件的委托(代理)的用法示例详解
2022/02/18 Javascript
MySQL数据库实验之 触发器和存储过程
2022/06/21 MySQL