【问题标题】:Destroy user session from cron job从 cron 作业中销毁用户会话
【发布时间】:2013-05-27 17:09:16
【问题描述】:

我正在构建一个强制门户(用于互联网浏览的主机点)。我想从后台作业中销毁会话,并在时间到期后从页面中注销用户。

我不知道该怎么做。通常,会话销毁必须与用户登录的页面编码到同一页面中,但我想在特定时间后从登录用户的 cron 作业中销毁会话。

有没有办法将一些变量传递给在 cron 下运行的 PHP 脚本以销毁会话并注销用户?

【问题讨论】:

  • 如果您依赖数据库来存储会话,您可以从数据库中删除记录,然后告诉您的代码如果会话不存在于预期的数据库中,则终止会话跨度>

标签: php


【解决方案1】:

如果你使用 php 的默认会话存储,即文件,你将无法做你想做的事。 您需要将会话保存到数据库中,有许多 php 类可以完成这项工作。会话进入数据库后,每个会话行都将关联一个用户 ID(在登录时填充)和最后一个活动的时间戳。
根据这两列,您可以从您拥有的任何 cronjob 中删除用户会话。

【讨论】:

  • 使用 crontab 删除会话文件怎么样?喜欢-mtime +30 -exec rm {}
  • “你将无法做你想做的事”,为什么?它只是 apache 可以读取的文件
  • 通常会话将以各种名称存储在/tmp 中,但除了会话文件之外,您还有其他临时文件,也不能很好地删除它们(即使具有正确的权限)。接下来归结为性能与可访问性。数据库访问很容易,而 shell 访问很困难
  • 简单的答案是更改会话保存路径
  • 如果他只需要删除一个特定的用户会话怎么办?扫描 n 个文件,阅读它们,然后删除正确的文件?为什么要经历所有的麻烦?
【解决方案2】:

你在哪里举行会议?

如果它在 /tmp/ 文件夹中的序列化文件中(默认) 那么你可以使用:

foreach(scandir('/tmp/') as $session_file)
{
   if(substr($session_file, 0, 5) != 'sess_')
   {
       // not a sessoin file
       continue;
   }

   // load sessoin
   $current_session = unserialize(file_get_contents('/tmp/' .  $session_file));

   // do some tests
   if($current_session['abc'] == 'def')
   {
       // store somthing in it
       $current_session['ghi'] = 'jkl';
       file_put_contents('/tmp/' .  $session_file, serialize($current_session));

       // or delete the session file
       unlink('/tmp/' .  $session_file);
   }
}

【讨论】:

  • 当数据库会话可以减轻他的工作数十倍时,为什么要这样做?另外,你的解决方案比数据库访问慢得多,如果他关心性能,你的解决方案应该从一开始就放弃。
  • 是的,如果有可用的数据库,那会更快,但这也需要更新当前代码才能使用数据库,但是当他要求 cronjob 时,我给了一个不需要数据库且不需要更改当前源代码的解决方案
  • 是的,如果可以进行所需的更改,您的灵魂会更快。
  • 我需要为用户销毁特定会话并将他从页面上注销,这可以用你的代码吗?
【解决方案3】:

你最好的可能是数据库。

存储用户 session_id 及其创建时间和到期时间。然后只需在您的 CLI 类上运行 cron 作业并检查数据库中的过期会话列表,然后从服务器中删除它们(位置取决于您的 php 设置)。 删除后还要在数据库中将它们标记为无效,这会使会话无效。

当然,您必须稍微更改您的代码来测试用户正在呈现的会话是否存在。

【讨论】:

    【解决方案4】:

    你可能会在服务器上创建一个名为 force_session_expire.php 的文件,看起来像这样

    <?php
    ini_set('session.gc_probability', 1); 
    ini_set('session.gc_divisor', 1);
    session_start();
    ?>
    
    This makes it so there is a 1 in 1 chance that you will kick off garbage collection. then you start the session so the garbage collection will be done. 
    

    在您使用的任何命令调度程序中,每小时启动一次(通过 wget 或 curl 调用)。

    【讨论】:

      猜你喜欢
      • 2019-07-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2012-01-02
      • 2014-05-26
      相关资源
      最近更新 更多