用于清除 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()
方法。因此,必须为每个驱动程序手动实施。
从不同的答案中汲取灵感,我想出了这个解决方案:
- 创建命令
php artisan make:command FlushSessions
- 在
app/Console/Commands/FlushSessions.php
中创建 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();
}
}
- 运行 命令
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
已在“文件”、“数据库”驱动程序上测试。
清除 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()
方法。因此,必须为每个驱动程序手动实施。
从不同的答案中汲取灵感,我想出了这个解决方案:
- 创建命令
php artisan make:command FlushSessions
- 在
app/Console/Commands/FlushSessions.php
中创建 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();
}
}
- 运行 命令
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
已在“文件”、“数据库”驱动程序上测试。