0

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

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

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

4

4 回答 4

1

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

于 2013-05-31T19:46:56.597 回答
1

你在哪里举行会议?

如果它在 /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);
   }
}
于 2013-05-31T19:51:03.790 回答
0

你最好的可能是数据库。

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

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

于 2013-05-31T19:48:17.153 回答
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 调用)。

于 2013-05-31T19:56:15.983 回答