session/cookie

Posted on Posted in php
Tips: 本文创建于2014年5月2日,已超过 2 年,内容或图片可能已经失效!

目录

cookie

cookie变量值的数据类型只能是字符串类型
如果存在其他数据类需要保存到cookie内,需要将其转成字符串再保持到cookie内。
cookie变量名支持下标的使用
setCookie('stu[name]','张三');
setCookie('stu[gender]','male');
在数据传输到服务器端时,PHP对数据进行处理的过程中,会将类似的名字的cookie变量整理成一个数组的形式出现:var_dump($_COOKIE['stu']);

setCookie('名', '值', 有效期);
setCookie('stu[name]','张三',time+3600);
setCookie('stu[gender]','male');//会话cookie,临时的,浏览器关闭后就消除
setCookie('data','string',PHP_INT_MAX);//永久cookie
setCookie('stu[gender]','male',time()-1);//删除cookie
setCookie('stu[gender]','');//删除cookie

cookie有效范围
setCookie('where','in book',0,'/');

session

开启session
session.auto_start = 1;
注意:
session不能被重复开启:
在自动开启后再session_start(),或者执行多次sessoin_start()时
后续的开启会被忽略掉,因此,在session_start()前增加一个@屏蔽错误信息即可!
@session_start();

$_SESSION操作
$_SESSION数组不允许出现整型下标
$_SESSION[3]这是错误的

元素的值可以是任意类型
$_SEESION['bool'] = false;
$_SEESION['float'] = 123.456
$_SEESION['array'] = array('name'=>'张三','gender'=>'male');

session删除
删除一个session数据: unset($_SESSION[‘key’]);
删除多个session数据,全部删除: $_SESSION = array();
删除保存session的文件,销毁session:
特定函数:session_destory();注意销毁的仅仅是session的数据文件,而不是$_SESSION数组:

完全删除一个session
清空session数据: $_SESSION=array();
删除session文件:session_destory();
//删除sessionID: setCookie('PHPSESSID', '', time()-1);
删除sessionID: setCookie(session_name(), '', time()-1); 注意:php.ini:session.name = PHPSESSID

session的存储机制重写

表->

字段类型功能备注
sess_idvarchar(32)sessionIDPK
sess_datatextsession数据序列化的字符串内容
expireint最后处理时间时间戳

[code lang="php"]
<?php
//
//create table `session` (
//sess_id varchar(32) primary key,
//sess_data text,
//expires int,
//)engine=innodb charset=utf8;
//alter table session add column expires int default 1234567890;
//定义自定义的存储函数
//告知PHP的session机制,需要时调用:

session_set_save_handler(
'sess_open',//打开
'sess_close',//关闭
'sess_read',//读数据
'sess_write',//写数据
'sess_destroy',//销毁
'sess_gc'//垃圾回收处理
);
/**
* @param $sess_name
* @param $save_path
*/
function sess_open($sess_name, $save_path) {
echo 'open<br>';
//初始化工作
//连接数据
$GLOBALS['link'] = mysql_connect('localhost:3306', 'root', '123456');
mysql_query('set names utf8');
}
function sess_close() {
echo 'close<br>';
return true;
}
/**
* 执行时机:session_start()开启session时
*
* @param $sess_id string sessionID
*
* @return string 获得的内容
*/
function sess_read($sess_id) {
echo 'read<br>';
//获得数据
$sql = "select sess_data from `test`.`session` where sess_id='$sess_id'";
//TIP:不需要整条记录,需要的sess_data内的数据
$result = mysql_query($sql, $GLOBALS['link']);
if ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
return $row['sess_data'];
} else {
return '';
}

}
/**
* 写操作
* 将序列化好的$_SESSION内的数据,写入到相应的位置
* 执行时机:脚本结束时并且没有执行过session_destroy()时。
*
* @param $sess_id string sessionID
* @param $sess_data string 序列化好的数据
*
*/
function sess_write($sess_id, $sess_data) {
echo 'write<br>';

$now = time();
//写入,如果冲突则更新
$sql = "insert into `test`.`session` values ('$sess_id', '$sess_data', $now) on duplicate key update sess_data='$sess_data', expires=$now";
//tip:记录不存在则插入,存在则更新
return mysql_query($sql, $GLOBALS['link']);
}
/**
* 销毁session的存储记录
* 执行时机:调用了session_destroy()时
*
* @param $sess_id string
*
*/
function sess_destroy($sess_id) {
echo 'destroy<br>';

//删除
$sql = "delete from `test`.`session` where sess_id='$sess_id'";
return mysql_query($sql, $GLOBALS['link']);
}
/**
* 删除掉过期的数据
*
* @param $max_lifetime session数据的最大有效期
*/
function sess_gc($max_lifetime) {
echo 'gc<br>';

//删除过期数据
$now = time();
$sql = "delete from `test`.`session` where expires<$now-$max_lifetime";
return mysql_query($sql, $GLOBALS['link']);

}
?>

[/code]

垃圾回收

php.ini中设置超时
session.gc_maxlifetime = 1440

写操作时更新
function sess_write($sess_id, $sess_data) {
echo 'write
';

$now = time();
//写入,如果冲突则更新
$sql = "insert into `test`.`session` values ('$sess_id', '$sess_data', $now) on duplicate key update sess_data='$sess_data', expires=$now";
//tip:记录不存在则插入,存在则更新
return mysql_query($sql, $GLOBALS['link']);
}

什么时候删除垃圾?
在session开启时(session_start()),有几率地执行垃圾回收操作,一旦执行,将所有的垃圾全部删除。
默认的执行概率为 1/1000,配置:
session.gc_probability = 1
session.gc_divisor = 1000

当垃圾回收函数执行时,完成垃圾回收的处理:
function sess_gc($max_lifetime) {
echo 'gc
';

//删除过期数据
$now = time();
$sql = "delete from `test`.`session` where expires<$now-$max_lifetime"; return mysql_query($sql, $GLOBALS['link']); } session 实例 protected function checkLogin(){ //判断浏览器用户是否登录 session_start(); if(!isset($_SESSION['admin'])){ //不存在,跳转 $this->jump('index.php');
}
}

session 实例

protected function checkLogin(){
//判断浏览器用户是否登录
session_start();
if(!isset($_SESSION['admin'])){
//不存在,跳转
$this->jump('index.php');
}
}

cookie 实例

在验证合法管理员后,判断是否需要记录登陆状态(那个勾选的记录登录状态)
if(isset($_POST['remember']) && $_POST['remember']=='1'){
setCookie('is_login','yes',PHP_INT_MAX); //时间自定,这里用最大值
}
在判断管理员是否登陆时,如果没有session中的登陆标识,再去判断是否据有cookie的保存的登陆标志
session_start();
if(!isset($_SESSION['admin'])){
//不存在
if(!isset($_SESSION['is_login'])){
$this->jump('index.php');
}else{
$_SEESION['admin'] = 'yes';
}
}

» 转载请注明来源:若我若鱼 » session/cookie

Leave a Reply

Your email address will not be published. Required fields are marked *

12 + ten =