2013-05-02 55 views
2

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

每个用户都有一个名为“状态”的会话变量,它可以等同于“在线”,“通话中”,“中断”等。

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

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

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

+0

任何人都可以吗?我试图通过这种方式工作,但迄今为止没有运气。 – cream 2013-05-02 06:31:51

回答

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; 
} 
1

退房http://php.net/manual/en/function.session-id.php

无论你正在尝试做的,试图修改会话变量。如果不涉及数据库,我不认为有这样做是真的。您可以使用session_id()来存储您的主管会话ID,将她的$ _SESSION更改为其他用户,更改状态,然后将其更改回自己的会话中,但我不知道如何获取其会话ID在会话开始时放置在数据库中的第一位。

修复无论发生什么事情需要你改变50个不同的文件来添加一小块功能可能会在长远来说比“非传统的答案”更好地为您服务。

+0

这或多或少是我想要做的。所有会话ID在数据库中都可用,但会话变量不是。我想我会给这个镜头。 – cream 2013-05-02 07:14:09

1

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

最好是在数据库中保存会话,然后你可以很容易地操作/删除它。编写自定义会话处理程序的官方指南是here

如果你不想自己写,你可以使用第三方解决方案,例如, this one

1

如果您使用的是Apache服务器,会将任何类型的会话创建保存在名为tmp的文件夹中,名称为“sess409080ffgfsfs.tmp”。现在你只需要找出哪一个现存的文件是你正在寻找的文件。