php 中 session 更换存储方式(file, redis, mysql)

php 中 session 更换存储方式(file, redis, mysql)

file篇:

在 当前php的配置文件中修改 

查看当前配置文件链接:https://blog.csdn.net/miliu123456/article/details/107048506

session.save_handler = files //默认设置

;session.save_path = "/var/lib/php/sessions" //默认设置 
//加';'自动存到内存中 不加';'会生成一个文件,文件路径为上诉路径

redis篇:

修改配置文件如下

配置完之后

session.save_handler = redis

session.save_path = "tcp://127.0.0.1:6379"

php 代码

session_start();
$_SESSION['session_test'] = 'session测试';
var_dump($_SESSION);

redis 展示

127.0.0.1:6379> keys PHP*
1) "PHPREDIS_SESSION:ig1qae1uufoi1ep5nmt7o1o3tf"
127.0.0.1:6379> get PHPREDIS_SESSION:ig1qae1uufoi1ep5nmt7o1o3tf
"session_test|s:13:\"session\xe6\xb5\x8b\xe8\xaf\x95\";"
127.0.0.1:6379> 

PHPREDIS_SESSION 头缀是默认配置,可以在配置文件中修改

也可以直接在php 文件中配置 如:

ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379');

php 代码

ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://127.0.0.1:6379');
session_start();
$_SESSION['session_test'] = 'session测试';
var_dump($_SESSION);

redis 结果和上面一样

MYSQL 篇

该篇章使用的是替换session 机制的内置函数,所以无须修改配置文件

数据库配置

CREATE TABLE IF NOT EXISTS `t_session` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `session_key` varchar(100) NOT NULL DEFAULT '',
  `session_data` varchar(255) NOT NULL DEFAULT '',
  `expire_time` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

index.php

<?php

include "handle.php";
session_start();
$_SESSION['session_test'] = 'session测试';
var_dump($_SESSION);

 handle.php

设置固定的6个函数 替换session 的内部处理函数

<?php

//session启动时最先访问该方法
function open(){
    global $con;
    $con = mysqli_connect('127.0.0.1','root','root','test') or die ('连接数据库失败');
    mysqli_query($con, 'set names utf8');
    return(true);
}
function close(){
    global $con;
    mysqli_close($con);
    return(true);
}
//读取session
function read($key){
    global $con;
    $sql = "select session_data from t_session where session_key='".$key."'";
    $result = mysqli_query($con, $sql) or die('查询失败!');
    $row=mysqli_fetch_array($result);//or die()会终止后面的程序!
    if(!is_null($row)){
        return($row["session_data"]);
    }else{
        return "";//再次强调如果空值 ,则一定 要返回”“而不是false
    }
}


//存储session
function write($key,$data){
    global $con;
    $sql = "select session_data from t_session where session_key='".$key."'";
    $re = mysqli_query($con, $sql);
    $result = mysqli_fetch_array($re);
    if(is_null($result)){
        $sql="insert into t_session(session_key,session_data) values('".$key."','".$data."')";//字符串的时候要加单引号,数字的时候是不用加的
        $result = mysqli_query($con, $sql);
        if (!$result) {
            printf("Error: %s\n", mysqli_error($con));//%s表示的是字符串,这是c里面的
            exit();
        }
    }else{
        $sql="update t_session set session_data='".$data."'  where session_key='".$key."'";
        $result=mysqli_query($con,$sql);

    }
    return($result);
}
//清楚相应的session数据
function destroy($key){
    global $con;
    $sql="delete from t_session where session_key='".$key."'";
    $result=mysqli_query($con,$sql);
    return($result);
}
//执行垃圾回收
function overdue($expire_time){
    global $con;
    $time=time();
    $sql="delete from t_session where session_time<$time";
    $result=mysqli_query($sql);
    return($result);
}
session_set_save_handler('open','close','read','write','destroy','overdue');
?>

 open read write 都测试过,可以正常使用

只是测试版本,若需要添加过期时间,可以添加一个时间字段,设置过期时间

借鉴链接:https://www.php.cn/php-weizijiaocheng-407716.html

欢迎大家斧正

 

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值