Php 从cron作业销毁用户会话
我正在构建一个专属门户(用于互联网浏览的主机点)。我想从后台作业中销毁会话,并在时间到期后从页面注销用户 我不知道该怎么做。一般来说,会话销毁必须编码到用户登录的同一页面中,但我想在特定时间后从登录用户的cron作业中销毁会话Php 从cron作业销毁用户会话,php,Php,我正在构建一个专属门户(用于互联网浏览的主机点)。我想从后台作业中销毁会话,并在时间到期后从页面注销用户 我不知道该怎么做。一般来说,会话销毁必须编码到用户登录的同一页面中,但我想在特定时间后从登录用户的cron作业中销毁会话 是否有方法将一些变量传递给在cron下运行的PHP脚本,以销毁会话并注销用户?如果使用PHP的默认会话存储(即文件),您将无法执行所需的操作。 您需要的是将会话保存到数据库中,有许多php类可以完成这项工作。一旦会话进入数据库,每个会话行都将有一个关联的用户id(登录时填
是否有方法将一些变量传递给在cron下运行的PHP脚本,以销毁会话并注销用户?如果使用PHP的默认会话存储(即文件),您将无法执行所需的操作。 您需要的是将会话保存到数据库中,有许多php类可以完成这项工作。一旦会话进入数据库,每个会话行都将有一个关联的用户id(登录时填充)和一个带有最后一个活动的时间戳。
基于这两列,您可以从任何cronjob中删除用户会话。最好的可能是数据库 存储用户会话id及其创建时间和过期时间。然后在您的CLI类上运行cron作业,检查数据库中的过期会话列表,然后从服务器中删除它们(位置取决于您的php设置)。 在删除数据库后,还要将它们标记为无效,这将使会话无效
当然,您必须稍微更改代码,以测试用户所呈现的会话是否存在 你在哪里举行会议 如果它位于/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);
}
}
在服务器上创建一个名为force\u session\u 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.
这使得你有1/1的机会启动垃圾收集。然后启动会话,以便完成垃圾收集。
在您正在使用的任何命令调度器中,每小时启动一次(通过wget或curl调用) 如果您依赖数据库来存储会话,那么您可以从数据库中删除该记录,然后告诉您的代码,如果会话在数据库中不存在,则终止该会话,而数据库中不存在该会话,那么使用crontab删除会话文件怎么样?smth喜欢
-mtime+30-exec rm{}
“你将无法做你想做的事”,为什么?它只是apache可以读取的文件通常会话将以各种名称存储在/tmp
中,但是除了会话文件之外,您还有其他临时文件,删除这些文件也不太好(即使有正确的权限)。接下来是性能与可接受性。虽然数据库访问很容易获得,但shell访问却很难获得。答案是更改会话save paath如果他只需要删除一个特定的用户会话怎么办?扫描n个文件,读取它们,然后删除正确的文件?为什么要经历所有的麻烦?为什么在数据库会话可以让他的工作轻松几十倍的时候这么做?此外,您的解决方案比数据库访问慢得多,如果他关心性能,您的解决方案应该从一开始就删除。是的,如果有可用的数据库,这可能会更快,但这也需要更新当前代码以使用数据库,但由于他要求为cronjob做一些事情,我给出了一个不需要数据库,也不需要更改当前源代码的解决方案。另请参阅我的其他评论是的,如果可以进行所需的更改,您的解决方案会更快。我需要销毁用户的特定会话,并将其从页面上注销。您的代码是否可以这样做?