php 中 session 更换存储方式(file, redis, mysql)
file篇:
在 当前php的配置文件中修改
查看当前配置文件链接:ubuntu 18 中查看 php 的配置文件_miliu123456的博客-CSDN博客_ubuntu 查看php.ini
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 都测试过,可以正常使用
只是测试版本,若需要添加过期时间,可以添加一个时间字段,设置过期时间