cookie有效目录
默认只能在当前目录或者后代目录中生效
Session介绍
- session技术基于cookie技术
- session数据保存在服务器,避免安全问题,本地只保存会话编号
- 要使用一个会话,要显示开启一个会话,不管是存数据到会话,还是从会话取数据。
session_start():开启会话
session_id():获取会话编号,保存在当地浏览器cookie中 - session可以保存数组,cookie不行。session可以保存除资源外的数据类型。
Session配置
- 设置session保存路径:
打开php.ini配置文件,设置session.save_path=“N;MODE;/path” - N表示数字,几级目录保存。N=1表示session编号头个字作为文件夹名称,如果N=2,编号第一个字母作为一级文件夹名称,编号第二个字母作为第二级文件夹名称。
- 设置session会话编号的名称
session.name=PHPSSID
Session入库
1、创建数据库表
2、session数据库操作
需要注意的点(被卡住一个晚上):
- 得修改php.ini文件里session_set_save_handler的值,将其修改为user
- 得注意session_set_save_handler每个函数的返回值
- 在read函数中,数据库查询不到请返回空字符串,return " ";
- 保证数据库操作语句正确,可以使用die来检查问题。
$r=mysqli_query($link,"use `database`") // 我就是被这一条语句折磨了一个晚上,当时没有使用反引号
$r=mysqli_query($link,"use ‘database ’ ”) // 错误语句
设置用户自定义会话存储函数
session_set_save_handler(6个自定义函数);
比如:
session_set_save_handler(
‘open’,
‘read’,
‘write’,
‘close’,
‘destroy’,
‘gc’
);
//完整代码
<?php
$link=NULL;
function open(){
global $link;
$link= mysqli_connect('localhost:3306','root','xxxx')or die("database connect error");
$r=mysqli_query($link,'set names utf8')or die("utf8 set error");
$r=mysqli_query($link,"use `database`")or die("use database error");
echo 'open<br>';
return true;
}
function close(){
echo 'close<br>';
global $link;
return mysqli_close($link);
}
function read($sess_id){
echo 'read<br>';
global $link;
$sql="select sess_value from sess where sess_id='$sess_id'";
$rs=mysqli_query($link,$sql)or die("read query error");
if($rows=mysqli_fetch_row($rs)){
return $rows[0];
} else
{
return"";
}
}
function write($sess_id,$sess_value){
echo 'write<br>';
global $link;
$time=time();
$sql="insert into sess values('$sess_id','$sess_value',$time)on duplicate key update sess_value='$sess_value'";
$rs=mysqli_query($link,$sql)or die("write query error");
return $rs;
}
function destroy($sess_id){
echo 'destroy<br>';
global $link;
$sql="delete from sess where sess_id='$sess_id'";
$rs=mysqli_query($link,$sql)or die("destroy del query error");
return $rs;
}
function gc($maxlifetime){
echo 'gc<br>';
global $link;
$time=time()-$maxlifetime;
$sql="delete from sess where sess_expires<$time";
$rs= mysqli_query($link,$sql)or die("gc del query error");
return $rs;
}
//测试 部分,亲测可入库!
session_set_save_handler('open','close','read','write','destroy','gc');
session_start();
$_SESSION['name']='tom';
$_SESSION['psw']='xxxxx';
Session垃圾回收机制
上面的数据库操作之后,我们发现垃圾回收gc函数似乎并没有起到作用,这是为什么呢?
php配置文件php.ini要修改一下,才能看到效果
- session.gc_maxlifetime = 1440,php.ini中的默认回收时间长,所以不易看出,我们可以手动改为 10秒,便于观察!
- session.gc_probability = 1 (分子)
- session.gc_divisor = 1000(分母)
表示垃圾回收的概率,默认是千分之一,1000次才执行一次(为了减轻服务器负荷不是每次都清理垃圾),数据量少看不出效果,我们需要把分子改成1000,表示百分百执行!改为配置文件重启阿帕奇服务器!