我正在建立一个强制门户(用于互联网浏览的主机点)。我想从后台作业中销毁会话,并在时间到期后从页面中注销用户。
我对如何做到这一点感到困惑。通常,会话销毁必须编码到与用户登录的页面相同的页面中,但我想在特定时间后从登录用户的 cron 作业中销毁会话。
有没有办法将一些变量传递给在 cron 下运行的 PHP 脚本以破坏会话并注销用户?
我正在建立一个强制门户(用于互联网浏览的主机点)。我想从后台作业中销毁会话,并在时间到期后从页面中注销用户。
我对如何做到这一点感到困惑。通常,会话销毁必须编码到与用户登录的页面相同的页面中,但我想在特定时间后从登录用户的 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 作业并检查数据库中的过期会话列表,然后从服务器中删除它们(位置取决于您的 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 调用)。