Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从cron作业销毁用户会话_Php - Fatal编程技术网

Php 从cron作业销毁用户会话

Php 从cron作业销毁用户会话,php,Php,我正在构建一个专属门户(用于互联网浏览的主机点)。我想从后台作业中销毁会话,并在时间到期后从页面注销用户 我不知道该怎么做。一般来说,会话销毁必须编码到用户登录的同一页面中,但我想在特定时间后从登录用户的cron作业中销毁会话 是否有方法将一些变量传递给在cron下运行的PHP脚本,以销毁会话并注销用户?如果使用PHP的默认会话存储(即文件),您将无法执行所需的操作。 您需要的是将会话保存到数据库中,有许多php类可以完成这项工作。一旦会话进入数据库,每个会话行都将有一个关联的用户id(登录时填

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

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


是否有方法将一些变量传递给在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做一些事情,我给出了一个不需要数据库,也不需要更改当前源代码的解决方案。另请参阅我的其他评论是的,如果可以进行所需的更改,您的解决方案会更快。我需要销毁用户的特定会话,并将其从页面上注销。您的代码是否可以这样做?