从cron作业中销毁用户会话


Destroy user session from cron job

我正在构建一个专用门户(用于internet浏览的主机点)。我想从后台作业中销毁会话,并在超时后从页面注销用户。

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

是否有一种方法可以将一些变量传递给在cron下运行的PHP脚本以破坏会话并注销用户?

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

会话存储在哪里?

如果它在/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);
   }
}

你最好的最好的可能是数据库。

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

当然你需要稍微修改一下你的代码来测试会话是否存在。

你可能会在服务器上创建一个名为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调用)。