标签:
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‘);
标签:
原文地址:http://blog.csdn.net/hraymon/article/details/43992741