Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何销毁特定的PHP会话_Php_Zend Framework - Fatal编程技术网

如何销毁特定的PHP会话

如何销毁特定的PHP会话,php,zend-framework,Php,Zend Framework,我想了解如何在PHP中销毁特定会话。通过合作伙伴网站,用户使用令牌登录主网站并获得完整会话 如果用户从合作伙伴网站注销,合作伙伴网站也可以调用销毁功能。然后我们也应该注销我们自己的用户 最好的方法是什么?Zend_Sessiondestroy方法不接受参数,类似地,PHP函数Session_destroy也不接受参数 我正在考虑两种选择: 直接从文件/memcache中删除会话信息,但更喜欢“更干净”的方法 检查每个页面请求是否为“令牌”用户;然后通过维护一个列表来检查他们的令牌是否过期。这会增

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

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

最好的方法是什么?Zend_Sessiondestroy方法不接受参数,类似地,PHP函数Session_destroy也不接受参数

我正在考虑两种选择:

  • 直接从文件/memcache中删除会话信息,但更喜欢“更干净”的方法

  • 检查每个页面请求是否为“令牌”用户;然后通过维护一个列表来检查他们的令牌是否过期。这会增加繁忙网站的开销,但可能是我唯一的选择


  • 或者有第三种/更好的方法我没有看到吗?

    如果您希望能够“踢”用户的会话,唯一的方法就是使用MySQL(或其他数据库,甚至sqlite)作为会话存储

    然后,您可以简单地从数据库中删除条目以终止会话

    这还允许您执行诸如“控制”特定用户的会话等操作:)

    请参阅以下内容,了解一个非常基本的演练:(这不是最好的示例,但足以让您开始学习完整的示例)

    编辑


    另外,如果通过合作伙伴站点注销,我过去使用过的另一种方法(O2和其他类似站点)会给他们一个“回调”(大多数情况下是RESTAPI调用)当用户从他们的站点注销时,他们也需要调用该数据库。

    数据库解决方案意味着会话数据库需要在主站点和合作伙伴站点之间共享,通常情况并非如此等等。也许这些琐碎的事情就够了

    <img src="mainwebsite/logout.php">
    
    
    
    Main网站/logout.php:

    <?php session_destroy(); ?>
    

    无需启动自己的会话处理

    session_id()可以接受一个参数,即您要使用的会话id

    因此,当您将用户传递到合作伙伴站点时,请传递他们的会话id(或某些令牌,或其他)

    然后允许合作伙伴站点点击如下脚本:

    kill-user-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.
    

    有趣的想法——然而,一个快速的Google给出了以下见解,这是适用的,因为这是一个繁忙的Web服务器,有许多并发用户(因此使用memcache进行会话):“有些人认为SQLite不适合于写密集型环境,因为它使用单个文件作为数据库。每次更新会话时,数据库文件都会被锁定,因此必须一次更新一个而不是同时更新多个会话。另一个问题可能是腐败。如果一个基于SQLite的会话损坏,所有会话都将丢失。“就个人而言,我也不会使用SQLite。。。仅说明PHP就可以使用多种方法。我已经使用MySQL与PHP进行会话管理很长时间了,从“简单”cms系统到呼叫中心应用程序。感谢您的链接,这是一个很好的方法来滚动您自己的会话管理例程。Yep,如果你把它和一些API调用结合起来,当有人从他们的站点注销时,他们应该调用这些API调用,这将是一个灵活的解决方案,有多种方式:)Brian-你的答案很好,你完全不正确,你需要mySQL或任何自定义会话后端来完成这项工作。请参阅我的答案,它提供了一个简单的解决方案,可用于任何会话存储后端,包括基于文件的默认会话。他问的是如何销毁特定会话,而不是当前用户的会话。在我看来,他的问题的实质是注销主网站当前登录的用户,在合作伙伴网站上。抱歉,叶,但您的回答仍然无法提供无缝的用户体验。我将收回我的反对票,编辑你的答案,这样我就可以这样做:)可能重复的有时,最好的答案不是被接受的答案。这是最好的答案。