PHP中如何检查指定Session ID是否存在?
如何检查指定Session ID是否仍存在?
我该如何检查Session ID
066efd5a182729d6fdbd43cb3a80adde是否存在?(我知道它过去曾存在,但需要确认现在是否仍存在)我期望能实现类似这样的逻辑:
session_exists("066efd5a182729d6fdbd43cb3a80adde") ? "this session exists" : "this session expired/got deleted/whatever";
注:此问题并非以下问题的重复:
- 有的提问者需要检查当前请求是否包含有效的Cookie会话(可通过
session_status() == PHP_SESSION_NONE解决),但我的问题无法用此方法解决 - 有的提问者询问“如何在PHP中检查SESSION存在但为空”,我显然不是要检查
$_SESSION是否为空。
解决方法
PHP没有原生的session_exists()函数,要检查指定Session ID是否存在,得根据你的会话存储方式来实现:
1. 默认文件存储方式
如果你的PHP会话是存在服务器本地文件里的(默认配置session.save_handler = files),直接检查对应的会话文件即可:
function session_exists($sessionId) { // 获取会话文件存储路径,默认是系统临时目录,也可通过session_save_path()获取 $savePath = session_save_path() ?: sys_get_temp_dir(); // 会话文件名格式是sess_开头加Session ID $sessionFile = $savePath . DIRECTORY_SEPARATOR . 'sess_' . $sessionId; if (!file_exists($sessionFile)) { return false; } // 额外检查会话是否过期,基于PHP的session.gc_maxlifetime配置 $maxLifetime = ini_get('session.gc_maxlifetime'); return (filemtime($sessionFile) + $maxLifetime) > time(); } // 调用示例 echo session_exists("066efd5a182729d6fdbd43cb3a80adde") ? "this session exists" : "this session expired/got deleted/whatever";
2. Redis/数据库等其他存储方式
如果会话存在Redis、数据库这类外部存储里,要对应调用存储系统的查询逻辑:
- Redis存储:如果用了Redis作为会话存储(
session.save_handler = redis),直接查询对应的Redis key即可,通常key的前缀是PHPREDIS_SESSION:function session_exists($sessionId) { $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // 按你的Redis配置修改 $sessionKey = 'PHPREDIS_SESSION:' . $sessionId; if (!$redis->exists($sessionKey)) { return false; } // 检查会话剩余有效期 $ttl = $redis->ttl($sessionKey); return $ttl > 0; } - 数据库存储:如果是自定义数据库存储会话,直接查询会话表,判断是否存在该Session ID的记录,且记录未过期即可。
内容的提问来源于stack exchange,提问作者hanshenrik
相关产品推荐
相关产品推荐

