用于清除 Laravel 中所有会话数据的 Artisan 命令

Posted

技术标签:

【中文标题】用于清除 Laravel 中所有会话数据的 Artisan 命令【英文标题】:Artisan command for clearing all session data in Laravel 【发布时间】:2018-11-16 20:14:05 【问题描述】:

在 Laravel 中清除所有会话数据的工匠命令是什么,我正在寻找类似的东西:

$ php artisan session:clear

但显然它不存在。如何从命令行清除它?

我尝试过使用

$ php artisan tinker  
...
\Session::flush();

但它只刷新一个用户的会话,我想刷新所有用户的所有会话。我该怎么做?

我试过了:

artisan cache:clear

但它并没有清除会话。

【问题讨论】:

您可以从 storage/framework/sessions 中手动删除。您可以自己编写 artisan 命令来自动执行此过程。 laravel.com/docs/5.6/artisan#writing-commands 我在登台时将它放在表中,在本地将它放在飞行中,使用一个命令会更容易、更通用。 我懒得运行 mysql Workbench 只是为了截断一个表。加载时间太长,需要执行的步骤太多。 【参考方案1】:

如果您使用基于文件的会话,您可以使用以下 linux 命令清除会话文件夹:

rm -f storage/framework/sessions/*

【讨论】:

请提供解释,我的意思是可以不使用artisan command,但只有在session data 中使用file driver 时才有效,对吧?跨度> 这也删除了.gitignore 文件,该文件用于在提交时保留(空)文件夹。 @YevgeniyAfanasyev 答案已根据您的反馈更新【参考方案2】:

更新:这个问题似乎经常被问到,很多人仍在积极评论它。

在实践中,使用

刷新会话是一个可怕的想法
php artisan key:generate

它可能会造成各种破坏。最好的方法是清除您使用的任何系统。


懒惰程序员刷新所有会话的指南:

php artisan key:generate

由于指定了新的应用程序密钥,将使所有会话无效

不那么懒惰的方法

php artisan make:command FlushSessions

然后插入

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use DB;

class flushSessions extends Command

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'session:flush';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Flush all user sessions';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    
        parent::__construct();
    

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    
        DB::table('sessions')->truncate();
    

然后

php artisan session:flush

【讨论】:

让您的用户退出登录很有趣:D 请注意,生成新的应用密钥会破坏您可能在 Laravel 中加密的任何其他数据。 不要仅仅因为您想摆脱会话而使生产应用程序中的应用程序密钥无效。它还将使所有加密(未散列)不可读。也许你的应用没有存储任何加密数据,但在 *** 上向陌生人推荐它似乎不是一个好主意。 另外,答案的第二部分仅在您将会话存储到数据库时才有效。请注意,通常情况并非如此(例如,如果您使用 Redis 会话存储或使用 cookie 会话存储)。 @DevinGray 遗憾的是,没有。查看 Laravel 的加密文档,其中明确指出应用密钥用于所有类型的加密:laravel.com/docs/5.7/encryption【参考方案3】:

问题在于 PHP 的 SessionHandlerInterface 不强制会话驱动程序提供任何类型的 destroyAll() 方法。因此,必须为每个驱动程序手动实现。

从不同的答案中汲取灵感,我想出了这个解决方案:

    创建命令
php artisan make:command FlushSessions 
    app/Console/Commands/FlushSessions.php 中创建类
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class FlushSessions extends Command

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'session:flush';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Flush all user sessions';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    
        parent::__construct();
    

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    
        $driver = config('session.driver');
        $method_name = 'clean' . ucfirst($driver);
        if ( method_exists($this, $method_name) ) 
            try 
                $this->$method_name();
                $this->info('Session data cleaned.');
             catch (\Exception $e) 
                $this->error($e->getMessage());
            
         else 
            $this->error("Sorry, I don't know how to clean the sessions of the driver '$driver'.");
        
    

    protected function cleanFile () 
        $directory = config('session.files');
        $ignoreFiles = ['.gitignore', '.', '..'];

        $files = scandir($directory);

        foreach ( $files as $file ) 
            if( !in_array($file,$ignoreFiles) ) 
                unlink($directory . '/' . $file);
            
        
    

    protected function cleanDatabase () 
        $table = config('session.table');
        DB::table($table)->truncate();
    

    运行命令
php artisan session:flush

欢迎其他驱动程序的实现!

【讨论】:

【参考方案4】:

摆脱所有会话的简单方法是更改​​会话 cookie 的名称。这可以通过更改config/session.php 文件中的'cookie' =&gt; '...' 行轻松完成。

这独立于您使用的会话存储,也不会触及除会话数据之外的任何其他数据(因此对我来说似乎比更新应用程序密钥解决方案更可取,在这种情况下,您会丢失存储在应用程序)。

【讨论】:

不错的解决方案,谢谢。你是对的。 APP_KEY 也是使用 Hash::make() 创建的哈希的盐。所以用户密码和任何其他哈希数据在更改后将无效。 为什么比在同一个文件中更改domain更好? @algorhythm bcrypt 密码将继续工作。不确定其他密码哈希算法。尽管使用 Laravel 加密功能,但您对手动散列的数据库列是正确的(因为与密码不同,这些列需要解密)。【参考方案5】:

我知道这是一个旧线程,但对我有用的只是删除 cookie。

在 Chrome 中,转到您的开发控制台,转到“应用程序”选项卡。在侧边栏中找到“Cookies”,然后点击它前面的小箭头。转到您的域名并单击过滤器字段旁边的图标以清除您的域的 cookie。刷新页面,所有会话数据都是新的,旧的被删除。

【讨论】:

这对开发者来说很棒,但对用户来说呢?【参考方案6】:

如果您想从您使用的任何驱动程序中完全删除会话。 使用这段代码

\Session::getHandler()->gc(0); // Destroy all sessions which exist more 0 minutes

在“文件”、“数据库”驱动程序上测试。

当然,您可以结合我的答案和@Davin Gray 的答案来制作控制台命令。 我只是没有足够的声誉来评论问题。 这就是为什么我写了单独的答案

【讨论】:

【参考方案7】:

这个帖子很老了。但我想分享我为基于文件的驱动程序删除所有会话的实现。

        $directory = 'storage/framework/sessions';
        $ignoreFiles = ['.gitignore', '.', '..'];
        $files = scandir($directory);

        foreach ($files as $file) 
            if(!in_array($file,$ignoreFiles)) unlink($directory . '/' . $file);
        

为什么我没有使用 linux 命令 'rm'?

因为 PHP 是 Laravel 的先决条件之一,而 Linux 不是。使用这个 Linux 命令将使我们的项目只能在 Linux 环境中实现。 这就是为什么在 Laravel 中使用 PHP 是件好事。

【讨论】:

【参考方案8】:

如果您使用数据库会话,只需删除该表上的所有数据。 就我而言,它是“会话”表。

【讨论】:

【参考方案9】:

我的解决方案 拉拉维尔

// SESSION_DRIVER=file


$files = File::allFiles(storage_path('framework/sessions/'));
foreach($files as $file)
  File::delete(storage_path('framework/sessions/'.$file->getFilename()));

//OR

//SESSION_DRIVER=redis

Artisan::call('cache:clear'); // == php artisan cache:clear 

【讨论】:

【参考方案10】:

如果您将数据库用于会话驱动程序,则清空会话表。如果您在多个子域上使用单一登录,重新生成密钥会导致很多问题。清空会话表有助于减少会话表中的无用数据。您可以删除所有人浏览器上的 cookie。

【讨论】:

以上是关于用于清除 Laravel 中所有会话数据的 Artisan 命令的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 会话文件未从 framework/sessions 文件夹中清除

Laravel 不会删除/更新会话

如何在 laravel 中获取所有服务器会话的列表?

当所有检索值在laravel中具有相同的会话键时,如何检查会话数组是不是具有唯一的ID

Laravel:注销特定用户

PHP Laravel:如何设置或获取会话数据?