PHP核心编程-Cookie与Session技术

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,表示百分百执行!改为配置文件重启阿帕奇服务器!
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值