Что такое команда artisan для очистки всех данных сеанса в Laravel, я ищу что-то вроде:
$ php artisan session:clear
Но, видимо, его не существует. Как мне очистить его из командной строки?
Я пробовал использовать
$ php artisan tinker
...
\Session::flush();
Но он сбрасывает сеанс только одного пользователя, я хочу очистить все сеансы для всех пользователей. Как мне это сделать?
Я пробовал это:
artisan cache:clear
Но это снова не очищает сеанс.
У меня это есть в таблице по постановке и в файле на локальном компьютере, и использование одной команды было бы проще и универсальнее.
И мне лень запускать Mysql Workbench только для усечения таблицы. Загрузка занимает слишком много времени и слишком много шагов.






ОБНОВЛЕНИЕ: этот вопрос, кажется, задают довольно часто, и многие люди все еще активно его комментируют.
На практике убирать сеансы с помощью
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.
Я хотел бы иметь полный список этих зашифрованных данных, потому что на вопрос это нет хорошего ответа.
НЕ аннулируйте ключ приложений в производственном приложении только потому, что вы хотите избавиться от сеансов. Это также сделает все зашифрованные (не хешированные) нечитаемыми. Возможно, ваше приложение не хранит зашифрованные данные, но рекомендовать его незнакомым людям в StackOverflow не кажется хорошей идеей.
Кроме того, вторая часть ответа работает только тогда, когда вы сохраняете свои сеансы в базе данных. Обратите внимание, что часто это может быть не так (например, если вы используете хранилище сеансов Redis или хранилище сеансов cookie).
Ключ приложения @miho Laravel используется только для расшифровки файлов cookie сеанса, поэтому их удаление - безопасная практика.
@DevinGray К сожалению, нет. Ознакомьтесь с документацией по шифрованию Laravel, где четко сказано, что ключ приложения используется для всех видов шифрования: laravel.com/docs/5.7/encryption
Значение ключа приложения, stackoverflow.com/questions/49445420/…
Это работает, только если ваш SESSION_DRIVER - это база данных. Во всех остальных случаях это не сработает: файл, cookie, Redis и т. д.
Я думаю, что не рекомендуется восстанавливать APP_KEY с помощью php artisan key:generate, потому что это уничтожит все пароли пользователей, не так ли?
Что насчет драйвера Redis. Как получить доступ к сеансу подключения Redis?
@algorhythm - Нет, он не уничтожает пароли пользователей, я тестировал, и это не так. Но я думаю, что так и должно быть.
Простой способ избавиться от всех сеансов - изменить имя файла cookie сеанса. Это легко сделать, изменив строку 'cookie' => '...' в файле config/session.php.
Это работает независимо от хранилища сеанса, которое вы используете, а также не будет касаться каких-либо других данных, кроме данных сеанса (и, таким образом, мне кажется предпочтительнее, чем обновление решения ключа приложения, когда вы потеряете любые зашифрованные данные, хранящиеся в приложении).
Хорошее решение, спасибо. И ты прав. APP_KEY также является солью для хэшей, созданных с помощью Hash::make(). Таким образом, пароль пользователя и любые другие хешированные данные будут недействительными после его изменения.
Почему лучше, чем менять domain в том же файле?
Пароли @algorhythm bcrypt будут продолжать работать. Не уверены в других алгоритмах хеширования паролей. Вы правы насчет хешированных вручную столбцов базы данных, которые используют функцию шифрования Laravel (потому что их нужно расшифровывать, в отличие от паролей).
Если вы используете файловые сессии, вы можете использовать следующую команду Linux для очистки папки сессий:
rm -f storage/framework/sessions/*
Пожалуйста, дайте объяснение, я имею в виду, что это нормально, что это не artisan command, но он будет работать, только если вы используете file driver для своего session data, верно?
Это также удалит файл .gitignore, который находится там, чтобы сохранить (пустую) папку при фиксации.
@YevgeniyAfanasyev ответ был обновлен на основе вашего отзыва
Эта ветка довольно старая. Но я хотел бы поделиться своей реализацией удаления всех сессий для файлового драйвера.
$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.
Проблема в том, что SessionHandlerInterface PHP не заставляет драйверы сеанса предоставлять какой-либо метод 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
Приветствуются реализации для других драйверов!
Если вы используете сеанс базы данных, просто удалите все данные в этой таблице. В моем случае это таблица сессий.
Мое решение 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 для вашего домена. Обновите страницу, и все данные сеанса будут новыми, а старые будут удалены.
Это здорово для разработчика, но как насчет пользователей?
Если вы используете базу данных для драйвера сеанса, очистите таблицу сеансов. Повторное создание ключа вызовет множество проблем, если вы используете один логин на многих поддоменах. Очистка сеансовой таблицы помогает уменьшить количество бесполезных данных в сеансовой таблице. Вы можете удалить файлы cookie в браузере любого пользователя.
Вы можете удалить вручную из хранилища / framework / sessions. Вы можете сами написать команду artisan, чтобы автоматизировать этот процесс. laravel.com/docs/5.6/artisan#writing-commands