使用Redis保存session

<?php
declare(strict_types=1);
ini_set('display_errors', 'On');
error_reporting(-1);

const REDIS_HOST = 'localhost';
const REDIS_PORT = 6379;
const REDIS_AUTH = '*****';


//========== session保存方式①:files ==========//
// ini_set('session.save_handler', 'files');
// ini_set('session.save_path', __DIR__ . '/session_save');


//========== session保存方式②:redis ==========//
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://' . REDIS_HOST . ':' . REDIS_PORT . '?auth=' . REDIS_AUTH);
// 重要提醒:这两处修改要在session_start()前执行。


session_name('MANONG_SESSIONID');
session_start();

$redis = new Redis();
$redis->connect(REDIS_HOST, REDIS_PORT);
$redis->auth(REDIS_AUTH);

echo '当前 session.save_handler = ' . ini_get('session.save_handler') . PHP_EOL;
echo '当前 session.save_path = ' . ini_get('session.save_path') . PHP_EOL;

$action = (string)($_GET['action'] ?? 'set');


//========== 设置session数据 ==========//
if ($action === 'set') {
    $_SESSION['name'] = '张三';
    $_SESSION['gender'] = '男';
    $_SESSION['birth'] = 2003;

    $redis->close();
    exit('SET OK');
}


//========== 获取session数据 ==========//
if ($action === 'get') {
    // 获取所有用户的session数据(注意:是所有用户,不仅仅是当前用户)
    $keys = $redis->keys('*');
    foreach ($keys as $key) {
        $value = $redis->get($key);
        echo "【{$key}】 => 【{$value}】" . PHP_EOL;

        $my = 'PHPREDIS_SESSION:' . session_id();
        if ($my === $key) {
            echo "俺的PHPREDIS_SESSION_KEY是:{$key},俺的数据是:{$value}。" . PHP_EOL;
        }
    }

    $name = $_SESSION['name'] ?? 'N/A';
    $gender = $_SESSION['gender'] ?? 'N/A';
    $birth = $_SESSION['birth'] ?? 'N/A';
    echo "俺叫{$name}{$gender}),出生于{$birth}年。" . PHP_EOL;

    $redis->close();
    exit;
}
// 当前 session.save_handler = redis
// 当前 session.save_path = tcp://localhost:6379?auth=*****
// 【PHPREDIS_SESSION:68ldtm634p9qnrlhjic2a2pil4】 => 【name|s:6:"张三";gender|s:3:"男";birth|i:2003;】
// 俺的PHPREDIS_SESSION_KEY是:PHPREDIS_SESSION:68ldtm634p9qnrlhjic2a2pil4,俺的数据是:name|s:6:"张三";gender|s:3:"男";birth|i:2003;。
// 俺叫张三(男),出生于2003年。


//========== 销毁session数据 ==========//
if ($action === 'clr') {
    $_SESSION = [];
    session_destroy();

    $redis->flushAll(); // 重要提醒:这里是删除Redis里所有用户的session数据,不仅仅是当前用户

    $redis->close();
    exit('CLEAR OK');
}


// 测试地址
// --------------------------------------------------
// 销毁session数据:http://www.domain.com/test.php?action=clr
// 设置session数据:http://www.domain.com/test.php?action=set
// 获取session数据:http://www.domain.com/test.php?action=get

Copyright © 2024 码农人生. All Rights Reserved