从cron作业中销毁用户会话

时间:2013-05-31 19:43:44

标签: php

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

我很困惑如何去做。通常,会话销毁必须编码到用户登录的同一页面中,但我想在特定时间后从登录用户的cron作业中销毁会话。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你最好的可能是数据库。

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

当然,您需要稍微更改一下代码,以测试用户是否存在会话。

答案 2 :(得分:0)

你在哪里存储会话?

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

答案 3 :(得分:0)

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

相关问题