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

Artisan command for clearing all session data in Laravel

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

$ php artisan session:clear

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

我尝试使用

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

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

我试过这个:

artisan cache:clear

但它不会再次清除会话。


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

实际上,使用

刷​​新会话是一个糟糕的想法
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

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

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

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

rm -f storage/framework/sessions/*

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

        $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

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

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

  1. 创建命令
php artisan make:command FlushSessions 
  1. app/Console/Commands/FlushSessions.php
  2. 中创建 class
<?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();
    }
}
  1. 运行 命令
php artisan session:flush

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

如果您使用数据库会话,只需删除该 table 上的所有数据。 在我的例子中是 'sessions' table.

我的解决方案 Laravel

// 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 

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

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

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

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

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

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