session配置 如何销毁一个特定的PHP会话




session_unset (3)

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

如果用户从合作伙伴网站注销,合作伙伴网站也可以调用销毁功能。 然后我们也应该注销我们自己的用户。

什么是最好的办法呢? Zend_Session销毁方法不接受参数,PHP函数session_destroy也不行。

我正在考虑两个选择:

  1. 直接从文件/ memcache中删除会话信息,但宁愿比这更“清洁”的方法。

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

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


如果你希望能够“踢”一个用户的会话,唯一的办法就是如果你使用MySQL(或其他的db,sqlite甚至是)你的会话存储。

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

这也可以让你做某些事情,如“控制”特定用户的会话和其他东西:)

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

编辑

此外,如果通过合作伙伴网站注销,另一种方法,我曾经在过去(这是与O2和其他这样的网站),他们给了一个“回调”(大多数情况下,REST API调用),他们也需要调用当用户注销他们的网站时。


数据库解决方案意味着会话数据库需要在主网站和合作伙伴网站之间共享,而这往往不是这样的情况。或许沿着这些微不足道的东西就足够了?

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

mainwebsite / logout.php:

<?php session_destroy(); ?>

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

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 POST到您的kill-user-session脚本,并且用户的会话在服务器上被销毁。

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





zend-framework