2012-01-27 55 views
0

如果我想在当前用户会话中取消设置一个变量,那么我可以使用命令unset($_SESSION['something'])php - 这可能会从其他会话中取消设置一个变量吗?

如果我知道PHPSESSID值(我可以在不更改当前用户会话的情况下执行操作),是否可以从其他会话中只取消一个变量?我想检查一下PHPSESSID的会话是否仍然存在,如果存在,则选择PHPSESSID的unset($_SESSION['something'])

+5

这是可能的,但它不是直接或简单。我建议这是不好的设计,一个用户不需要在另一个用户的会话中做任何事情。试着寻找一种不同的方式来解决任何你想解决的问题。 – deceze 2012-01-27 09:27:51

+0

你如何拥有多个会话? – 2012-01-27 09:29:18

+0

我有其他解决方案。我可以让CRON接管会话并更改一个变量。 'SESSION_ID($ variable_PHPSESSID); session_start();'但我想以其他方式做到这一点。我认为这可以以更简单的方式完成。但我也会考虑重新组织我的脚本。 – Lucas 2012-01-27 09:34:35

回答

2

这是可能未设置在案件的其他会议只有一个变量,当我知道PHPSESSID值

是的,这是可能的,你需要知道会话的会话ID,你会喜欢从中取消设置变量/值。

我可以在不更改当前用户会话的情况下执行此操作吗?

如果你想用标准的PHP函数做到这一点,不切换会话是不可能的。借助第三方库,您可以做到不切换会话。

我想检查一下PHPSESSID会话是否仍然存在,如果存在则选择PHPSESSID的unset($_SESSION['something'])

这是非常相似的答案php destroy a session which is not the current session,但只能删除特定成员:

$unsetFromSessionID = ... ; # set your session id from where you want to unset from 
$unsetVariableName = 'something'; # set the variable name 

$backupSessionID = session_id($unsetFromSessionID); 
session_start(); # load session data 
unset($_SESSION[$unsetVariableName]); 
session_commit(); # save changes to disc 

session_id($backupSessionID); # switch to current session 
session_start(); 

如果你想看看其他的会议是活跃与否,这是不可能的这种方法和PHP内部,因为如果它不存在,PHP将在session_start()上创建一个新的空会话。

另一种方法是直接使用会话存储,例如,通过在光盘上查找会话文件,加载它的内容,删除一个变量并将其保存回来。一个能够做到的PHP库是Serialized,它附带一个Session File Viewer的例子,这可能是一个很好的起点。

参见:How to tell if a session is active?

0

为了更好的安全性,我知道这样做并不是好事 - 感谢您对该问题的评论。那么通过CRON任务可以更好地完成任务,而无需任何用户访问,对吗?

session_id($variable_PHPSESSID); 
session_start(); 
unset($_SESSION['something']); 
0

如果要更改每个会话ID登录,确保登录过程中使用session_regenerate_id(真)。

session_start(); 
    session_regenerate_id(true);