2011-07-18 129 views
3

我在寻找如何在PHP中销毁特定会话的见解。通过合作伙伴网站,用户使用令牌登录主网站并获得完整会话。如何销毁特定的PHP会话

也可以为合作伙伴的网站调用destroy函数如果来自合作伙伴的网站用户注销。然后我们也应该注销我们自己的用户。

这是最好的方法是什么? Zend_Session销毁方法不接受参数,同样PHP函数session_destroy既不。

我正在考虑两个方案:

  1. 直接从文件/内存缓存中删除会话信息,但希望比这个更“干净”的做法。

  2. 在如果这是一个“令牌”用户每个页面请求检查;如果通过维护列表来检查它们的令牌是否过期。这增加了繁忙网站的开销,但可能是我唯一的选择。

还是有没有第三个/更好的方法,我没有看到?

+0

可能重复的[使用会话ID取消设置会话](http://stackoverflow.com/questions/6703842/unset-a-specefic-session-using-session-id) – symcbean

回答

1

如果您希望能够以“踢”用户(S)的会议,你可以做到这一点是如果你使用MySQL(或一些其它数据库,SQLite的偶数)为您的会话存储的唯一途径。

然后,你可以简单地从数据库中删除条目来杀死一个会话。

这也让你做的做的事情,例如,“采取控制”特定用户的会话和其他的东西:)

的看到这个通过一个非常基本的运行:http://www.devshed.com/c/a/MySQL/Custom-Session-Management-Using-PHP-and-MySQL/(不是最好的例子,但不够好完整的例子来启动你)。

编辑

另外,如果通过合作伙伴网站注销,另一种方法我已经在过去的(这与O2和其他类似网站),他们分别获得了“回调”使用(REST API调用在大多数情况下),当用户退出他们的网站时他们也需要呼叫。

+0

有趣的想法 - 一个快速的Google然而,由于这是一个拥有许多并发用户的繁忙网络服务器(因此使用会话的memcache),因此提供了以下见解:“ 有人认为SQLite不适用于写密集型环境,因为它使用每次会话更新时,数据库文件都会被锁定,因此多次会话必须一次更新一次,而不是一次更新。另一个问题可能是损坏。如果单个基于SQLite的会话被损坏,所有会话会迷路。” – Tramov

+1

个人我不会使用SQLite ...只是说明PHP可以使用它的多种方法。我已经使用MySQL进行会话管理很长一段时间了,从'简单'cms系统到呼叫中心应用程序。 – Brian

+0

感谢您的链接,它是一个伟大的howto滚动自己的会话管理例程。 – Tramov

-2

的数据库解决方案意味着会话数据库需要mainwebsite和合作伙伴站点之间共享,这往往并非如此等等也许沿着这些琐碎的东西线就足够了?

<img src="mainwebsite/logout.php"> 

mainwebsite/logout.php:

<?php session_destroy(); ?> 
+0

他在问如何销毁一个特定的会话,而不是当前用户的会话。 – Brian

+0

正如我所看到的,他的问题的实质是在登录合作伙伴网站时注销主网站的当前登录用户。 –

+0

对不起,但你的答案仍然不能提供无缝的用户体验。我会收回我的投票寿 - 编辑你的答案,所以我可以这样做:) – Brian

4

有没有必要推出你自己的会话处理。

session_id()可以接受一个参数,您想要使用的会话ID。

所以,当你通过用户关闭的合作伙伴站点,沿其SESSION_ID(或一些象征性的,或其他)通过。

然后让合作伙伴网站打一个这样的脚本:

杀-用户session.php文件

<?php 
/** 
* Destroy any active session identified by $_POST['sid'] 
*/ 
session_id($_POST['sid']); 
session_start(); //this line may not even be necessary 
session_destroy(); //destroys that session. 

因此,当用户注销的合作网站,合作伙伴网站职位session_id(你给他们)到你的kill-user-session脚本,并且用户的会话在你的服务器上被销毁。

当然,您可能想通过某种方法限制对kill-user-session.php的访问。

+0

有时候,最好的答案不是被接受的答案。这是最好的答案。 – Peter