码迷,mamicode.com
首页 > 其他好文 > 详细

Session详解

时间:2015-03-01 09:08:57      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

1、seesion的基本原理
存储于浏览器端Cookie中的session-id,就是一个普通的cookie变量(在session机制中尤其特殊的含义)
每个会话,所生成存储于服务器端的session数据区,默认的,以文件的形式,存储于服务器端操作系统的临时目录中
使用session的优势:
(1).会话数据原文存储于浏览器端,原始数据安全性较低。如果cookie数据量较大,由于每次请求都要携带,增加带宽使用。
(2).使用session技术来实现:将会话数据,存储于服务器端!同时使会话数据可以区分浏览器!
(3).在服务器端为每个会话数据建立独立的会话数据区(来存储当前会话的全部数据),每个会话数据区存在唯一的标志,同时浏览器端存储该唯一标志,做配对使用!

2、基本操作
(1)、开启session机制

第一种方式:session_start();
第二种方式:通过php.ini设置为自动开启:Session.auto_start
(2)、利用$_SESSION操作session数据
增,删,改,查,都是使用$_SESSION完成。
每个元素,就是session数据。
就像操作普通数组一样,操作$_SESSION数组,就可以完成对session数据的操作!
示例说明:
//开启session机制
  session_start();
  //增加session数据
  $_SESSION[‘class_name‘]=‘php34‘;
  $_SESSION[‘teacher_name‘]=‘han‘;
  //删除session数据
  unset($_SESSION[‘class_name‘]);
  //修改session数据
  $_SESSION[‘class_name‘]=‘changePHP34‘;
  //查看session数据存放的结构
  var_dump($_SESSION[‘class_name‘]);
  var_dump($_SESSION[‘teacher_name‘]);
  测试文件内容:
  session_start();
echo $_SESSION[‘class_name‘];
结论:在示例文件中销毁seesion数据,测试文件得不到内容;
           若在浏览器关闭后,先访问测试文件,也将得不到输出内容,说明session的有效期就是当前会话结束。
  注:seesion数据的设置可以完成登陆状态的储存

3、Session数据属性
如果需要更改session数据的属性,则需要更改存储session-ID的cookie变量PHPSESSID的属性;
php.ini中存在该属性的配置
(1).有效期:会话结束
php.ini中:session.cookie_lifetime = 0
(2).有效路径:整站有效
php.ini中:session.cookie_path = /
(3).有效域:当前域
php.ini中:session.cookie_domain =
(4).是否仅安全连接传输:否
php.ini中:;session.cookie_secure =
(5).是否仅为HTTPONLY使用
php.ini中:session.cookie_httponly =
以上session数据的特征,都是由浏览器cookie中所存储的session-idcookie变量的特征所导致的。
注意:如果需要对默认属性加以修改,有以下三种方法:
第一种方式:更改php.ini配置文件即可(不建议)
第二种方式:通过在脚本中,使用函数ini_set()来进行配置的修改,仅在设置后的脚本周期内有效,要保证在开启session前设置完毕(可以选择)
Ini_set(‘选项’, ‘值’)
第三种方式:(推荐)使用特定功能函数:
session_set_cookie_params(有效期, 有效路径,有效域,是否仅安全传输,是否HTTPONLY)设置完成,先使用特定功能函数,再开启session_start()。
注意:
 选项的设置是针对cookie中的sessionID,因此是针对所有session数据的.
 Session属性通常都会保持其默认值,不建议修改。

4、Session使用语法问题
Session数据可以是任意的数据类型,cookie的数据是字符串类型。
由于session的数据可以是任意的数据类型,因此,session内的数据是序列化后才存储的。
(1)、$_SESSION数组元素的下标,仅仅可以是字符串类型
$_SESSION[‘34‘]=‘php34‘;  //数组的下标不能为数字,会报错
示例:$_SESSION[‘student_list‘] = array(
             array(‘name‘=>‘han‘, ‘gender‘=>‘male‘, ‘hobby‘=>array(‘足球‘,‘篮球‘,‘排球‘)),
             array(‘name‘=>‘杨过‘, ‘gender‘=>‘male‘, ‘hobby‘=>array(‘小龙女‘,‘雕‘,‘打仗‘))
    );
(2)、Session_start(),类似于header函数,前不应该有输出,空格,php代码前的html也不能有

5、Session数据区
在脚本周期外,持久存储当前会话session数据的区域。
在脚本周期内,使用$_SESSION这个变量管理的会话session数据

6、Session销毁
(1)、使用函数session_destory();来对session进行销毁
销毁:删除当前session对应的数据区,关闭session机制。
关闭session机制后,导致余下的session操作都不处理。
注意:
$_SESSION 变量,在销毁session后,是不会自动消失,但结束不完成写操作。因此下次脚本周期,就不能获取到存储的session数据。
(2)、如何完整删除与当前session相关的全部数据?
Session_destroy(); 数据区
Unset($_SESSION); 销毁变量
//setCookie(‘PHPSESSID’, ‘’, time()-1), 销毁cookie中的session-iD
setCookie(session_name(), ‘’, time()-1), 销毁cookie中的session-iD
注意:PHPSESSID,称之为session.name 可以被配置的php.ini
使用函数session_name()来获取当前的值!
(3)、如何清空session数据?
不要使用 unset($_SESSION)
需要使用:$_SESSION = array();

7、重写session的存储机制
目的:
1,便于管理大量的session数据
2,便于web服务器集群共享session数据。
方案:
       入库,入内存
实现过程:
定义(实现)自定义的相关的存储处理函数
将其设置为session机制需要的存储函数(告知给session机制,使用我们的函数完成存储处理)

Session机制,共需要6个存储处理函数
Begin、End、Read、Write、Delete、GC
function userSessionBegin(){
 echo "<br>Begin</br>";
}
function userSessionEnd(){
 echo "<br>End</br>";
}
function userSessionRead(){
 echo "<br>Read</br>";
}
function userSessionWrite(){
 echo "<br>Write</br>";
}
function userSessionBeinDelete(){
 echo "<br>Delete</br>";
}
function userSessionGC(){
 echo "<br>GC</br>";
}
设置session的存储机制函数:
使用PHP函数:
Session_set_save_handler(开始处理器,结束处理器,读处理器,写处理器,删除处理,垃圾回收处理器)
session_set_save_handler(
 ‘userSessionBegin‘,
 ‘userSessionEnd‘,
 ‘userSessionRead‘,
           ‘userSessionWrite‘,
 ‘userSessionDelete‘,
           ‘userSessionGC‘
  );

8、建立session表
表中的记录,对应session文件。
create table `session` (
 session_id varchar(40) not null default ‘‘,
 session_content text,
 primary key(session_id)
)charset=utf8 engine=myisam;

9、读操作
session机制开启的过程中调用,作用是从当前的session数据区读取内容。
为了从session表里获取当前的会话数据,则需要传递一个$sess_id,来获取当前的session数据,
结果返回的不是整条数据,而是一个字符串
示例:
           function userSessionRead($sess_id){
 echo "<br>Read<br>";
 $link=mysql_connnect(‘localhost:3306‘,‘root‘,‘123456‘);
 mysql_query(‘set names utf8‘);
 mysql_query(‘use `shop34`‘);
 $sql="select session_content from `session` where session_id=`$sess_id`";
 $result=mysql_query($sql);
 if($row=mysql_fetch_assoc($result)){
     return $row[‘session_content‘];
 }else{
    //没有找到,返回空字符串
    return ‘ ‘;
 }

10、写操作
脚本周期结束,才会有写操作
任务:将当前脚本处理好的session数据,持久化存储到数据库中。
需要两个参数:$sess_id [需要知道写到数据库哪条记录里面]
                          $sess_content 是个字符串类型,序列化好的session内容字符串
//$sess_id存在则替换对应的内容字符串,不存在则插入
   function userSessionWrite($sess_id,$sess_content){
    echo "<br>Write<br>";
    //初始化数据库服务器连接
    $link=mysql_connect("localhost:3306",‘root‘,‘123456‘);
    mysql_query(‘set names utf8‘);
    mysql_query(‘use `shop34` ‘);
    $sql="REPLACE INTO `session` VALUES(‘$sess_id‘,‘$sess_content‘)";
    //也可用以下sql语句替换
    //$sql="insert into `session` VALUES(‘$sess_id‘,‘$sess_content‘) on DUPLICATE KEY update session content=‘$sess content‘ ";
    return mysql_query($sql);
   }

11、删除操作
 执行时机:调用了session_destroy()销毁session过程中被调用
 工作:删除当前session的数据区(记录)
function userSessionDelete($sess_id) {
 echo ‘<br>Delete<br>‘;
 link=mysql_connect("localhost:3306",‘root‘,‘123456‘);
    mysql_query(‘set names utf8‘);
    mysql_query(‘use `shop34` ‘);
 //删除
 $sql = "DELETE FROM `session` WHERE session_id=‘$sess_id‘";
 return mysql_query($sql);
}

12、垃圾回收操作gc
如何识别垃圾数据区?
PHPsession机制设置session数据区的最大有效期,某条session记录(数据区),在最后一次处理后,如果超过了多久之后没有被使用,则被视为垃圾数据。
(1).该时间默认为1440s,可以被配置:
在php.ini中修改 session.gc_maxlifetime = 1440
(2).同时需要记录每个session数据区的最后处理时间;
增加字段,记录最后处理时间,
在写操作时,将其更新$sql="REPLACE INTO `session` VALUES(‘$sess_id‘,‘$sess_content‘,unix_timestamp())";

如何执行删除?
在开启session机制过程中,有概率的执行垃圾回收操作。
(1)默认的概率为1/1000,修改垃圾回收的概率
第一种方式:
可以在php.ini中配置:session.gc_probability = 1
除数基础:session.gc_divisor = 1000
第二种方式:
在session_start();之前写入修改代码
示例:
<?php
//配置
ini_set(‘session.gc_probability‘, ‘1‘);
ini_set(‘session.gc_divisor‘, ‘3‘);
session_start();
$_SESSION[‘class_name‘] = ‘PHP34‘;
$_SESSION[‘teacher_name‘] = ‘KANG‘;

由以上分析实现垃圾回收机制的操作:
function userSessionGC($max_lifetime) {
 echo ‘<br>GC<br>‘;
 link=mysql_connect("localhost:3306",‘root‘,‘123456‘);
    mysql_query(‘set names utf8‘);
    mysql_query(‘use `shop34` ‘);
 //删除
 $sql = "DELETE FROM `session` WHERE last_time<unix_timestamp()-$max_lifetime";
 return mysql_query($sql);
}

13、开始Begin
Session开启时,最早执行的一个存储机制相关方法,用于初始化存储操作的相关资源

14、结束End
在session机制关闭时,执行的方法,最后一个执行的存储相关操作,用于收尾性工作!

注意:
(1)、为了保证session不自动开启
可以通过.htaccess配置需要的选项:php_flag session.auto_start 0
(2)、在session_start()执行之前,先执行 session_set_save_handler()
Session_set_save_handler函数(开始处理器,结束处理器,读处理器,写处理器,删除处理,垃圾回收处理器)

(3)、为了重写session存储机制,应该将其改为user表示用户自定义;
配置 session.save_handler,files是PHP内置的session存储处理器,
修改php.ini中session.save_handler = files为session.save_handler = user

15、会话总结:
session和cookie都是实现会话的方法;
Session基于cookie。

Cookie禁用,session是否可用?
常规:Cookie禁用,session不能用;
技术上,可以使用:
Cookie用来存储session的 ID,每次请求时携带。
通过 get,post,方式向服务器传递session-ID。

16、PHP提供如下的设置,帮助在cookie禁用的情况下,通过get或post方法传输sessionid
是否仅仅使用cookie来传输session-ID:ini_set(‘session.use_only_cookies‘, ‘0‘);
是否自动采用其他方式传session-id:ini_set(‘session.use_trans_sid‘, ‘1‘);

示例session表结构:
 create table `session` (
 session_id varchar(40) not null default ‘‘,
 session_content text,
 last_time int not null default 0,
 primary key(session_id)
)charset=utf8 engine=myisam;

 示例代码:
 session.php
<?php
//配置垃圾回收机制的概率
ini_set(‘session.gc_probability‘, ‘1‘);
ini_set(‘session.gc_divisor‘, ‘3‘);
require ‘./userSession.php‘;

// ini_set(‘session.use_only_cookies‘, ‘0‘); //没有开启基于cookies的session的会话方式
// ini_set(‘session.use_trans_sid‘, ‘1‘);  //值为1,为了实现session变量进行跨页传递
session_start();
$_SESSION[‘class_name‘] = ‘PHP34‘;
$_SESSION[‘teacher_name‘] = ‘KANG‘;

userSession.php
<?php
function userSessionBegin() {
  echo ‘<br>Begin<br>‘;
  //初始化数据库服务器连接
  $link = mysql_connect(‘127.0.0.1:3306‘, ‘root‘, ‘1234abcd‘);
  mysql_query(‘set names utf8‘);
  mysql_query(‘use `php34`‘);
}
function userSessionEnd() {
  echo ‘<br>End<br>‘;
  return true;
}
/**
 * 读操作
 * 执行时机:  session机制开启程中执行
 * 工作:    从当前session数据区读取内容
 * @param $sess_id string
 * @return string
 */
function userSessionRead($sess_id) {
  echo ‘<br>Read<br>‘;
  //查询
  $sql = "SELECT session_content FROM `session` WHERE session_id=‘$sess_id‘";
  $result = mysql_query($sql);
  if ($row = mysql_fetch_assoc($result)) {
    return $row[‘session_content‘];
  } else {
    //没有找到,返回空字符串
    return ‘‘;
  }
}
/**
 * 写操作
 * 执行时机:  脚本周期结束时,PHP在整理收尾时
 * 工作:    将当前脚本处理好的session数据,持久化存储到数据库中!
 * @param $sess_id string
 * @param $sess_content string 序列化好的session内容字符串
 * @return bool
 */
function userSessionWrite($sess_id, $sess_content) {
  echo ‘<br>Write<br>‘;
  // 完成写
  $sql = "REPLACE INTO `session` VALUES (‘$sess_id‘, ‘$sess_content‘, unix_timestamp())";
  // $sql = "INSERT INTO `session` VALUES (‘$sess_id‘, ‘$sess_content‘) ON DUPLICATE KEY UPDATE session_content=‘$sess_content‘, last_time=unix_timestamp()"
  return mysql_query($sql);
}
/**
 * 删除操作
 * 执行时机:  调用了session_destroy()销毁session过程中被调用
 * 工作:    删除当前session的数据区(记录)
 * @param $sess_id string
 * @return bool
 */
function userSessionDelete($sess_id) {
  echo ‘<br>Delete<br>‘;
  //删除
  $sql = "DELETE FROM `session` WHERE session_id=‘$sess_id‘";
  return mysql_query($sql);
}
/**
 * 垃圾回收操作
 * 执行时机:  开启session机制时,有概率的执行
 * 工作:    删除那些过期的session数据区
 * @param $max_lifetime
 * @return bool
 */
function userSessionGC($max_lifetime) {
  echo ‘<br>GC<br>‘;
  //删除
  $sql = "DELETE FROM `session` WHERE last_time<unix_timestamp()-$max_lifetime";
  return mysql_query($sql);
}

// 设置
session_set_save_handler(
  ‘userSessionBegin‘,
  ‘userSessionEnd‘,
  ‘userSessionRead‘,
  ‘userSessionWrite‘,
  ‘userSessionDelete‘,
  ‘userSessionGC‘
  );
ini_set(‘session.save_handler‘, ‘user‘);

Session详解

标签:

原文地址:http://blog.csdn.net/hraymon/article/details/43992741

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!