0

0

PHP中可以通过session id删除服务器上某个session吗?

php中文网

php中文网

发布时间:2016-06-23 13:47:03

|

1422人浏览过

|

来源于php中文网

原创

想实现一个踢出会员的功能,但是PHP中怎么做呢,我的想法是记录每次会员登录的session id,要踢某个会员的时候通过这个ID去把服务器上的这个session删除,达到踢人的效果,但是不知道PHP中能否通过 session id删除某个session,请教大家!!!


回复讨论(解决方案)

既然你能 记录每次会员登录的session id(显然要保存到数据库里)
那么你就直接将 session 的文件方式改成数据库方式不就得了
想踢哪个就把相应的记录删去就是了

既然你能 记录每次会员登录的session id(显然要保存到数据库里)
那么你就直接将 session 的文件方式改成数据库方式不就得了
想踢哪个就把相应的记录删去就是了


谢谢版主回答,可以不可以说得详细点,我现在是将session id保存在数据库里面,关键是客户端呀,比如你在后台获取了某个会员的session id,如何将客户端那边的session失效,这样就能踢出会员了,版主说的删除相应的记录是什么意思?用PHP不久,见笑了

session是存放在服务器的,你删除后客户端的session就获取不到了只能重新登录。

session是存放在服务器的,你删除后客户端的session就获取不到了只能重新登录。


我想知道怎么做啊,怎么删除,查了一下函数只有session_destroy(),这个函数还没有参数,只能删除本帐号登录的SESSION,要删除其它的通过SESSIONID怎么删除呢

版主意思是把session保存在db而不是保存在文件,因为你session id已经保存在db了,可以把session都保存在db,这样方便操作。然后根据session id来删除对应的db记录来实现了。

如果session是保存在文件的,也可以通过session id来删除文件实现。
session文件的保存位置是 session.save_path,可用phpinfo(); 查到

session_start();$_SESSION['test'] = 1;echo session_id();

以上代码执行后,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中会生成 sess_iak6l6lurg6o63a00tsdi0a4m5 文件,这个就是session文件。
然后根据iak6l6lurg6o63a00tsdi0a4m5 这个session id执行删除文件操作就可以了。

版主意思是把session保存在db而不是保存在文件,因为你session id已经保存在db了,可以把session都保存在db,这样方便操作。然后根据session id来删除对应的db记录来实现了。

如果session是保存在文件的,也可以通过session id来删除文件实现。
session文件的保存位置是 session.save_path,可用phpinfo(); 查到

session_start();$_SESSION['test'] = 1;echo session_id();

以上代码执行后,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中会生成 sess_iak6l6lurg6o63a00tsdi0a4m5 文件,这个就是session文件。
然后根据iak6l6lurg6o63a00tsdi0a4m5 这个session id执行删除文件操作就可以了。

立即学习PHP免费学习笔记(深入)”;


感谢,我试试看,谢谢了

既然你能 记录每次会员登录的session id(显然要保存到数据库里)
那么你就直接将 session 的文件方式改成数据库方式不就得了
想踢哪个就把相应的记录删去就是了


版主如果按照这样的方式那我删除了某一个用户的session id,用户每次访问一个页面的时候都还要查询一次数据库,判断session id还存在不,如果不存在就证明被T下线了,是这样吗?

版主意思是把session保存在db而不是保存在文件,因为你session id已经保存在db了,可以把session都保存在db,这样方便操作。然后根据session id来删除对应的db记录来实现了。

如果session是保存在文件的,也可以通过session id来删除文件实现。
session文件的保存位置是 session.save_path,可用phpinfo(); 查到

session_start();$_SESSION['test'] = 1;echo session_id();

以上代码执行后,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中会生成 sess_iak6l6lurg6o63a00tsdi0a4m5 文件,这个就是session文件。
然后根据iak6l6lurg6o63a00tsdi0a4m5 这个session id执行删除文件操作就可以了。

立即学习PHP免费学习笔记(深入)”;


用unlink ($myfile);删除文件的时候提示没有权限,怎么获取权限才能够删除session 的文件呢?

session_set_save_handler 到数据库方式后
相关操作由 php 自动完成,无需你在写代码

文件方式的 session 临时文件在用户操作期间是被锁定的,你只有在用户两次操作之间用
session_id(用户的sessionid);
session_unset();
session_write_close();
来删除该sessionid的临时文件

session_set_save_handler 到数据库方式后
相关操作由 php 自动完成,无需你在写代码

文件方式的 session 临时文件在用户操作期间是被锁定的,你只有在用户两次操作之间用
session_id(用户的sessionid);
session_unset();
session_write_close();
来删除该sessionid的临时文件


明白了,我犯了一个错误,应该删除其它session id的文件,而不是正在访问的session id,还有版主请教一下你,你说的
session_set_save_handler到数据库方式后,相关操作由PHP自动完成,请问是什么意思,我的意思是说,如果我要踢掉一个用户,把数据库中这个用户的session id值设置为空,然后被踢掉的这个用户再访问其它页面的时候,再查询一次自己的session id,如果为空就被T掉了,我现在的理解是这样,不知道对不对,是这样吗,版主,希望指点一下,感激!!!

对是这样的,没有了 sessionid 对应的记录,就得重新登录了

对是这样的,没有了 sessionid 对应的记录,就得重新登录了


谢谢版主的回复,可以结贴了

Descript
Descript

一个多功能的音频和视频编辑引擎

下载

对是这样的,没有了 sessionid 对应的记录,就得重新登录了


版主不好意思再请教一下你,这样一个php文件怎么用呢
/*============================文件说明======================================== 
@filename: session.class.php 
@description: 数据库保存在线用户session,实现在线用户功能! 
@notice: session过期时间一个小时,因为我们的站点是使用cookie(有效时间是1小时)登录。 
因此我们只记录用户登录的时间,而不是刷新一次更新一次 
删除数据库中session记录的动作发生在用户超时后执行这个文件或正常退出(session_destory) 
@database: database:sessions field:sessionid(char32),uid(int10),last_visit(int10) 
=============================================================================
*/
class session {
private $db;
private $lasttime=3600;//超时时间:一个小时
function session(&$db) {
$this->db = &$db;
session_module_name('user'); //session文件保存方式,这个是必须的!除非在Php.ini文件中设置了
session_set_save_handler(
array(&$this, 'open'), //在运行session_start()时执行
array(&$this, 'close'), //在脚本执行完成或调用session_write_close() 或 session_destroy()时被执行,即在所有session操作完后被执行
array(&$this, 'read'), //在运行session_start()时执行,因为在session_start时,会去read当前session数据
array(&$this, 'write'), //此方法在脚本结束和使用session_write_close()强制提交SESSION数据时执行
array(&$this, 'destroy'), //在运行session_destroy()时执行
array(&$this, 'gc') //执行概率由session.gc_probability 和 session.gc_divisor的值决定,时机是在open,read之后,session_start会相继执行open,read和gc
);
session_start(); //这也是必须的,打开session,必须在session_set_save_handler后面执行
}
function unserializes($data_value) {
$vars = preg_split(
'/([a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*)|/', 
$data_value, -1, PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE
);
for ($i = 0; isset($vars[$i]); $i++) {
$result[$vars[$i++]] = unserialize($vars[$i]);
}
return $result;
}
function open($path, $name) {
return true;
}
function close() {
$this->gc($this->lasttime);
return true;
}
function read($SessionKey){
$sql = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
$query =$this->db->query($sql);
if($row=$this->db->fetch_array($query)){
return $row['uid'];
}else{
return "";
}
}
function write($SessionKey,$VArray) {
require_once(MRoot.DIR_WS_CLASSES .'db_mysql_class.php');
$db1=new DbCom();
// make a connection to the database... now
$db1->connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);
$db1->query("set names utf8");
$this->db=$db1;
$SessionArray = addslashes($VArray);
$data=$this->unserializes($VArray);
$sql0 = "SELECT uid FROM sessions WHERE session_id = '".$SessionKey."' limit 1";
$query0 =$this->db->query($sql0);
if($this->db->num_rows($query0) if (isset($data['webid']) && !empty($data['webid'])) {
$this->db->query("insert into `sessions` set `session_id` = '$SessionKey',uid='".$data['webid']."',last_visit='".time()."'");
}
return true;
}else{
/*$sql = "update `sessions` set ";
 if(isset($data['webid'])){
 $sql .= "uid = '".$data['webid']."', " ;
 }
 $sql.="`last_visit` = null "
 . "where `session_id` = '$SessionKey'";
 $this->db->query($sql); */
return true;
}
}
function destroy($SessionKey) {
$this->db->query("delete from `sessions` where `session_id` = '$SessionKey'");
return true;
}
function gc($lifetime) {
$this->db->query("delete from `sessions` where unix_timestamp(now()) -`last_visit` > '".$this->lasttime."'");
return true;
}
}
?>
其它页面要用到这个技术,是不是每个页面都要引入这个类并且创建一个session类的对象呢,每个session 失效的时候是不是会调用函数destroy跟gc函数呢

好多大人啊,保存到数据库最好


版主意思是把session保存在db而不是保存在文件,因为你session id已经保存在db了,可以把session都保存在db,这样方便操作。然后根据session id来删除对应的db记录来实现了。

如果session是保存在文件的,也可以通过session id来删除文件实现。
session文件的保存位置是 session.save_path,可用phpinfo(); 查到

session_start();$_SESSION['test'] = 1;echo session_id();

以上代码执行后,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中会生成 sess_iak6l6lurg6o63a00tsdi0a4m5 文件,这个就是session文件。
然后根据iak6l6lurg6o63a00tsdi0a4m5 这个session id执行删除文件操作就可以了。


用unlink ($myfile);删除文件的时候提示没有权限,怎么获取权限才能够删除session 的文件呢?



我测试过可以啊,你删的是自己正在使用的session文件吗?那当然不行



版主意思是把session保存在db而不是保存在文件,因为你session id已经保存在db了,可以把session都保存在db,这样方便操作。然后根据session id来删除对应的db记录来实现了。

如果session是保存在文件的,也可以通过session id来删除文件实现。
session文件的保存位置是 session.save_path,可用phpinfo(); 查到

session_start();$_SESSION['test'] = 1;echo session_id();

以上代码执行后,例如session_id()返回 iak6l6lurg6o63a00tsdi0a4m5
在session.save_path中会生成 sess_iak6l6lurg6o63a00tsdi0a4m5 文件,这个就是session文件。
然后根据iak6l6lurg6o63a00tsdi0a4m5 这个session id执行删除文件操作就可以了。


用unlink ($myfile);删除文件的时候提示没有权限,怎么获取权限才能够删除session 的文件呢?



我测试过可以啊,你删的是自己正在使用的session文件吗?那当然不行


确实,我删除正在使用的,怪不得不行,session_set_save_handler这种方法应该是最好的,我试试看

session_set_save_handler 到数据库方式后
相关操作由 php 自动完成,无需你在写代码

文件方式的 session 临时文件在用户操作期间是被锁定的,你只有在用户两次操作之间用
session_id(用户的sessionid);
session_unset();
session_write_close();
来删除该sessionid的临时文件



$con = mysql_connect("127.0.0.1", "root" , "111111");

mysql_select_db("session");

function open($save_path, $session_name) {
    return(true);
}

function close() {
    return(true);
}

function read($id) {
    if ($result = mysql_query("select * from session where id='$id'")) {

        if ($row = mysql_fetch_array($result)) {
            return $row["data"];
        }
    } else {
        return "";
    }
}

function write($id, $sess_data) {

    $sql = "SELECT * FROM session WHERE id = '".$id."' limit 1";
    $check=mysql_query($sql);
    $total=mysql_num_rows($check);
    $result = false;
    if($total      $sql = "insert into `session` set `id` = '$id',data='".$sess_data."',last_visit='".time()."'";
     mysql_query($sql);
    }else{
     $sql = "update session set data='$sess_data', last_visit='".time()."' where id='$id'";
     $result = mysql_query($sql);
    }

    if ($result==true) {
        return true;
    } else {
        return false;
    }
}

function destroy($id) {

    if ($result = mysql_query("delete * from session where id='$id'")) {
        return true;
    } else {
        return false;
    }
}

function gc($maxlifetime) {
    $sql = "delete from `session` where unix_timestamp(now()) -`last_visit` > '60'";
    $result = mysql_query($sql);
    if ($result == true) {
        echo $sql;
        return true;

    } else {
        echo "error";
        return false;

    }

}

session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
@ini_set('session.gc_probability', 1);
@ini_set('session.gc_divisor', 2);
@ini_set('session.gc_maxlifetime', 60);
session_start();

?>//文件名session_user_start.php
版主求指点一下,我写了2个页面测试,
1.php

  include 'session_user_start.php';
  
  $_SESSION['test'] ="ok la";
  
  echo "init ok";
 
?>

另外一个
2.php

  include 'session_user_start.php';
  echo $_SESSION['test'];
?>
可以访问,但是60秒以后再去访问2.php发现gc那个函数并没有调用,请教一下怎么样才能在session失效的时候,访问2.php让GC这个 函数执行呢

gc那个可以写一个crontab实现。
http://blog.csdn.net/fdipzone/article/details/7263361

gc那个可以写一个crontab实现。
http://blog.csdn.net/fdipzone/article/details/7263361


gc有调用了,但是发现,其它页面引入include 'session_user_start.php';
  echo $_SESSION['test'];,发现在以前页面赋值的SESSION到了引入的session的页面,$_SESSION的值为空了,奇怪

知道是什么原因了read的时候要返回session的数据,这样引入到其它页面的时候才会得到session数据

使用static数组和session同时保存用户名+登录时间,验证的时候取session的数据和数组的数据比较,可行吗

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

331

2026.02.25

Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法
Steam官网正版入口与注册登录指南_新手快速进入游戏平台方法

本专题系统整理Steam官网最新可用入口,涵盖网页版登录地址、新用户注册流程、账号登录方法及官方游戏商店访问说明,帮助新手玩家快速进入Steam平台,完成注册登录并管理个人游戏库。

49

2026.02.25

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

33

2026.02.25

Python数据处理流水线与ETL工程实战
Python数据处理流水线与ETL工程实战

本专题聚焦 Python 在数据工程场景下的实际应用,系统讲解 ETL 流程设计、数据抽取与清洗、批处理与增量处理方案,以及数据质量校验与异常处理机制。通过构建完整的数据处理流水线案例,帮助开发者掌握数据工程中的性能优化思路与工程化规范,为后续数据分析与机器学习提供稳定可靠的数据基础。

13

2026.02.25

Java领域驱动设计(DDD)与复杂业务建模实战
Java领域驱动设计(DDD)与复杂业务建模实战

本专题围绕 Java 在复杂业务系统中的建模与架构设计展开,深入讲解领域驱动设计(DDD)的核心思想与落地实践。内容涵盖领域划分、聚合根设计、限界上下文、领域事件、贫血模型与充血模型对比,并结合实际业务案例,讲解如何在 Spring 体系中实现可演进的领域模型架构,帮助开发者应对复杂业务带来的系统演化挑战。

5

2026.02.25

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

19

2026.02.24

Golang 性能优化专题:提升应用效率
Golang 性能优化专题:提升应用效率

《Golang 性能优化专题》聚焦 Go 应用在高并发与大规模服务中的性能问题,从 profiling、内存分配、Goroutine 调度、GC 机制到 I/O 与锁竞争逐层分析。结合真实案例讲解定位瓶颈的方法与优化策略,帮助开发者建立系统化性能调优思维,在保证代码可维护性的同时显著提升服务吞吐与稳定性。

9

2026.02.24

Golang 面试题精选:高频问题与解答
Golang 面试题精选:高频问题与解答

Golang 面试题精选》系统整理企业常见 Go 技术面试问题,覆盖语言基础、并发模型、内存与调度机制、网络编程、工程实践与性能优化等核心知识点。每道题不仅给出答案,还拆解背后的设计原理与考察思路,帮助读者建立完整知识结构,在面试与实际开发中都能更从容应对复杂问题。

7

2026.02.24

Golang 运行与部署实战:从本地到云端
Golang 运行与部署实战:从本地到云端

《Golang 运行与部署实战》围绕 Go 应用从开发完成到稳定上线的完整流程展开,系统讲解编译构建、环境配置、日志与配置管理、容器化部署以及常见运维问题处理。结合真实项目场景,拆解自动化构建与持续部署思路,帮助开发者建立可靠的发布流程,提升服务稳定性与可维护性。

5

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号