2

我有一个不寻常的问题。我需要能够为任何给定用户的会话(除了我自己的)手动更改会话变量。该应用程序管理呼叫中心的员工。

每个用户都有一个名为“status”的会话变量,它可以等于“online”、“in-call”、“on-break”等。

当用户休息时,他们$_SESSION['status']将更改为“休息”。有些人有不点击“开始休息”按钮的习惯,所以我的老板问我是否可以给她功能让人们从她的管理员级别帐户中注销。

我不想将“中断”功能转换为使用数据库,因为这将是一个额外的查询,我必须手动添加到大约 50 个文件中。

我知道传统上这是不可能的,但我希望得到一些非常规的答案。例如,这是否可以通过在服务器本身上打开和写入会话文件来实现?

4

4 回答 4

1

if you are using apache server any kind of creation of session is saved inside a folder called tmp with names like 'sess409080ffgfsfs.tmp'. now you have to just find out which one of the existing files is the one you are looking for.

于 2013-05-02T06:45:42.013 回答
1

据我了解,您需要删除用户的会话才能将他注销。您可以物理删除服务器上的特定用户会话文件,但它很脆弱且不安全(恕我直言)。

最好将会话保存在数据库中,然后您可以轻松操作/删除它。编写自定义会话处理程序的官方指南在这里

如果您不想自己编写,可以使用 3rd 方解决方案,例如this one

于 2013-05-02T06:41:19.013 回答
1

查看http://php.net/manual/en/function.session-id.php

无论您尝试做什么,都尝试修改会话变量。我认为在不涉及数据库的情况下真的没有办法做到这一点。您可以使用 session_id() 来存储主管的会话 id,将她的 $_SESSION 更改为其他用户,更改状态,然后将其更改回她自己的会话,但我不知道您如何在除了在会话开始时将其放入数据库之外,它还处于首位。

修复任何需要您更改 50 个不同文件以添加一小部分功能的问题从长远来看可能比“非常规答案”更好。

于 2013-05-02T06:39:50.150 回答
0

事实证明,这不仅是可能的,而且非常容易。首先,将当前 session_id() 保存到一个变量,然后 session_write_close(),然后使用要编辑的会话的会话 id 启动一个新会话,编辑会话,然后再次 session_write_close 并使用 session_id 重新启动会话保存在上述变量中​​。

$temp = array();
$temp['tempid'] = session_id();
foreach($_SESSION as $key=>$val){
    $temp[$key]=$val;
}
$MESSAGE = "<h2>You have been remotely logged out by admin.</h2><h3>Please see ".$_SESSION['fname']." ".$_SESSION['lname']." before returning to work.</h3>";
session_write_close(); //end admin sesh

session_id($_GET['session']); //start remote sesh
session_start(); 

//Make changes to remote sesh here

session_write_close();

session_id($temp['tempid']); //restart local sesh
session_start();
foreach($temp as $key=>$val){
    $_SESSION[$key]=$val;
}
于 2013-05-06T05:53:10.387 回答