목차
回复讨论(解决方案)
백엔드 개발 PHP 튜토리얼 PHP中可以通过session id删除服务器上某个session吗?

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

Jun 23, 2016 pm 01:47 PM

想实现一个踢出会员的功能,但是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执行删除文件操作就可以了。


感谢,我试试看,谢谢了

既然你能 记录每次会员登录的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执行删除文件操作就可以了。


用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 对应的记录,就得重新登录了


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

对是这样的,没有了 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)<=0){
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的数据和数组的数据比较,可行吗

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

11 최고의 PHP URL 쇼트너 스크립트 (무료 및 프리미엄) 11 최고의 PHP URL 쇼트너 스크립트 (무료 및 프리미엄) Mar 03, 2025 am 10:49 AM

종종 키워드와 추적 매개 변수로 혼란스러워하는 긴 URL은 방문자를 방해 할 수 있습니다. URL 단축 스크립트는 솔루션을 제공하여 소셜 미디어 및 기타 플랫폼에 이상적인 간결한 링크를 만듭니다. 이 스크립트는 개별 웹 사이트 a에 유용합니다

Laravel의 플래시 세션 데이터로 작업합니다 Laravel의 플래시 세션 데이터로 작업합니다 Mar 12, 2025 pm 05:08 PM

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

Laravel Back End : Part 2, React가있는 React 앱 구축 Laravel Back End : Part 2, React가있는 React 앱 구축 Mar 04, 2025 am 09:33 AM

이것은 Laravel 백엔드가있는 React Application을 구축하는 데있어 시리즈의 두 번째이자 마지막 부분입니다. 이 시리즈의 첫 번째 부분에서는 기본 제품 목록 응용 프로그램을 위해 Laravel을 사용하여 편안한 API를 만들었습니다. 이 튜토리얼에서는 Dev가 될 것입니다

Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Mar 12, 2025 pm 05:09 PM

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> ​​'Hello World', 'github.com'=> ​​[ 'foo'=> 'bar'], 'forge.laravel.com'=>

PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 Mar 14, 2025 am 11:42 AM

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Mar 13, 2025 pm 12:08 PM

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

2025 PHP 상황 조사 발표 2025 PHP 상황 조사 발표 Mar 03, 2025 pm 04:20 PM

2025 PHP Landscape Survey는 현재 PHP 개발 동향을 조사합니다. 개발자와 비즈니스에 대한 통찰력을 제공하는 프레임 워크 사용, 배포 방법 및 과제를 탐색합니다. 이 조사는 현대 PHP Versio의 성장을 예상합니다

라 라벨에서 알림 라 라벨에서 알림 Mar 04, 2025 am 09:22 AM

이 기사에서는 Laravel 웹 프레임 워크에서 알림 시스템을 탐색 할 것입니다. Laravel의 알림 시스템을 사용하면 다른 채널을 통해 사용자에게 알림을 보낼 수 있습니다. 오늘은 알림을 보낼 수있는 방법에 대해 논의합니다

See all articles