【问题标题】:Ask Apache if a session still exists, from an ID从 ID 询问 Apache 会话是否仍然存在
【发布时间】:2011-08-31 18:41:35
【问题描述】:

我想知道如何检查一个 PHP 会话是否仍然存在,这要归功于给定的 ID。那个或任何可以让我访问活动会话列表的东西。

我在网上找到了一些相关资料,但无法真正得到正确的答案。

为了告诉您一些背景知识,我正在编写一个允许用户修改内容(例如文章)的网站。而且由于我不希望他们同时修改同一个资源,我不得不考虑一个保护系统。

所以想法是每个打开的资源都将被锁定并与一个会话 ID 相关联。完成后,用户将释放它。但当然没有什么能阻止他只是关闭窗口,让内容锁定在书写中。

因此,我必须能够检查会话是否仍然存在,以及锁是否仍然合法。

【问题讨论】:

    标签: php apache session


    【解决方案1】:

    我知道这可能是一个较老的问题,但您的问题的“最佳”答案可在此处找到: http://www.codeguru.com/forum/archive/index.php/t-372050.html

    它是这样说的: php.ini 文件包含一个名为 sesison.save_path 的设置,这决定了 PHP 将包含会话数据的文件放在哪里。一旦会话过时,PHP 将在下一次垃圾回收期间将其删除。因此,对该会话的文件是否存在的测试应该足以确定该会话是否仍然有效。

    $session_id = 'session_id';
    $save_path = ini_get('session.save_path');
    
    if (! $save_path) {
    $save_path = '.'; // if this value is blank, it defaults to the current directory
    }
    
    if (! file_exists($save_path . '/sess_' $session_id)) {
    unlink($session_id); // or whatever your file is called
    }
    

    【讨论】:

      【解决方案2】:

      有一个非常简单的解决方案可以解决您的问题:

      打开页面时,将用户标识和当前时间戳存储在用于锁定元素的某些列中。在页面上,包含一些 JavaScript 以每分钟调用一些脚本来更新时间戳 - 只要用户在此页面上,时间戳就永远不会超过 1 分钟。除非时间戳早于 1 分钟(几秒),否则只需阻止其他人编辑相同的元素。

      【讨论】:

      • +1;但是,如果同一个用户在多个浏览器或机器上编辑同一个片段,使用会话 ID 而不是用户 ID 可能更可行。
      • 在这种情况下,他只是覆盖了自己的更改,因此他可能知道自己在做什么——除此之外,丢失会话(浏览器崩溃、删除 cookie 等)否则会将真实用户锁定在外——甚至如果只是很短的时间。
      • 您提出的确实是一个可能的解决方案。但我不得不承认,我不太喜欢每隔“n”分钟提示一次数据库的想法,这听起来有点沉重。但无论如何,我使用的是 codeIgniter 的框架,我意识到它有一个数据库会话的处理程序,所以我的问题解决了:我只需要选择我想要的数据。
      • (miss-clic 抱歉)。尽管如此,出于您上面提到的原因,我仍会保留您使用用户名而不是会话 ID 的想法。但是,只是为了好奇,有人知道我一开始问的怎么做吗?因为我相信这会很有用!无论如何,谢谢大家的回答。
      • 使用索引的简单选择/更新不是问题,即使你每秒都这样做。
      猜你喜欢
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多