Команда Artisan для очистки всех данных сеанса в Laravel

Что такое команда artisan для очистки всех данных сеанса в Laravel, я ищу что-то вроде:

$ php artisan session:clear

Но, видимо, его не существует. Как мне очистить его из командной строки?

Я пробовал использовать

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

Но он сбрасывает сеанс только одного пользователя, я хочу очистить все сеансы для всех пользователей. Как мне это сделать?

Я пробовал это:

artisan cache:clear

Но это снова не очищает сеанс.

Вы можете удалить вручную из хранилища / framework / sessions. Вы можете сами написать команду artisan, чтобы автоматизировать этот процесс. laravel.com/docs/5.6/artisan#writing-commands

Khurram Shahzad 07.06.2018 05:32

У меня это есть в таблице по постановке и в файле на локальном компьютере, и использование одной команды было бы проще и универсальнее.

Yevgeniy Afanasyev 07.06.2018 05:34

И мне лень запускать Mysql Workbench только для усечения таблицы. Загрузка занимает слишком много времени и слишком много шагов.

Yevgeniy Afanasyev 07.06.2018 05:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
24
3
52 829
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Ответ принят как подходящий

ОБНОВЛЕНИЕ: этот вопрос, кажется, задают довольно часто, и многие люди все еще активно его комментируют.

На практике убирать сеансы с помощью

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

Спасибо. Теперь стало еще лучше. Принял.

Yevgeniy Afanasyev 07.06.2018 06:01

О, кто-то другой это одобрил. Отлично.

Yevgeniy Afanasyev 07.06.2018 06:03

Получайте удовольствие от выхода пользователей из системы: D

Devin Gray 07.06.2018 06:04

Обратите внимание, что создание нового ключа приложения нарушит любые другие данные, которые вы могли зашифровать в Laravel.

Pablo 07.06.2018 06:19

Я хотел бы иметь полный список этих зашифрованных данных, потому что на вопрос это нет хорошего ответа.

Yevgeniy Afanasyev 08.06.2018 01:04

НЕ аннулируйте ключ приложений в производственном приложении только потому, что вы хотите избавиться от сеансов. Это также сделает все зашифрованные (не хешированные) нечитаемыми. Возможно, ваше приложение не хранит зашифрованные данные, но рекомендовать его незнакомым людям в StackOverflow не кажется хорошей идеей.

miho 26.08.2018 11:28

Кроме того, вторая часть ответа работает только тогда, когда вы сохраняете свои сеансы в базе данных. Обратите внимание, что часто это может быть не так (например, если вы используете хранилище сеансов Redis или хранилище сеансов cookie).

miho 26.08.2018 11:30

Ключ приложения @miho Laravel используется только для расшифровки файлов cookie сеанса, поэтому их удаление - безопасная практика.

Devin Gray 25.09.2018 04:57

@DevinGray К сожалению, нет. Ознакомьтесь с документацией по шифрованию Laravel, где четко сказано, что ключ приложения используется для всех видов шифрования: laravel.com/docs/5.7/encryption

miho 25.09.2018 07:46

Значение ключа приложения, stackoverflow.com/questions/49445420/…

Shobi 11.11.2018 21:48

Это работает, только если ваш SESSION_DRIVER - это база данных. Во всех остальных случаях это не сработает: файл, cookie, Redis и т. д.

sergei 13.11.2018 11:31

Я думаю, что не рекомендуется восстанавливать APP_KEY с помощью php artisan key:generate, потому что это уничтожит все пароли пользователей, не так ли?

algorhythm 13.12.2018 14:25

Что насчет драйвера Redis. Как получить доступ к сеансу подключения Redis?

Boris D. Teoharov 07.01.2019 13:55

@algorhythm - Нет, он не уничтожает пароли пользователей, я тестировал, и это не так. Но я думаю, что так и должно быть.

Yevgeniy Afanasyev 20.02.2019 04:57

Простой способ избавиться от всех сеансов - изменить имя файла cookie сеанса. Это легко сделать, изменив строку 'cookie' => '...' в файле config/session.php.

Это работает независимо от хранилища сеанса, которое вы используете, а также не будет касаться каких-либо других данных, кроме данных сеанса (и, таким образом, мне кажется предпочтительнее, чем обновление решения ключа приложения, когда вы потеряете любые зашифрованные данные, хранящиеся в приложении).

Хорошее решение, спасибо. И ты прав. APP_KEY также является солью для хэшей, созданных с помощью Hash::make(). Таким образом, пароль пользователя и любые другие хешированные данные будут недействительными после его изменения.

algorhythm 13.12.2018 21:59

Почему лучше, чем менять domain в том же файле?

Yevgeniy Afanasyev 20.02.2019 04:53

Пароли @algorhythm bcrypt будут продолжать работать. Не уверены в других алгоритмах хеширования паролей. Вы правы насчет хешированных вручную столбцов базы данных, которые используют функцию шифрования Laravel (потому что их нужно расшифровывать, в отличие от паролей).

Flame 18.01.2020 03:31

Если вы используете файловые сессии, вы можете использовать следующую команду Linux для очистки папки сессий:

rm -f storage/framework/sessions/*

Пожалуйста, дайте объяснение, я имею в виду, что это нормально, что это не artisan command, но он будет работать, только если вы используете file driver для своего session data, верно?

Yevgeniy Afanasyev 20.02.2019 04:43

Это также удалит файл .gitignore, который находится там, чтобы сохранить (пустую) папку при фиксации.

Clément Baconnier 03.09.2019 13:30

@YevgeniyAfanasyev ответ был обновлен на основе вашего отзыва

benjaminhull 05.09.2019 13:25

Эта ветка довольно старая. Но я хотел бы поделиться своей реализацией удаления всех сессий для файлового драйвера.

        $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(). Таким образом, это должно быть реализовано вручную для каждого драйвера.

Взяв идеи из разных ответов, я пришел к следующему решению:

  1. Создать команду
php artisan make:command FlushSessions 
  1. Создать класс в 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();
    }
}
  1. Команда Run
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 для вашего домена. Обновите страницу, и все данные сеанса будут новыми, а старые будут удалены.

Это здорово для разработчика, но как насчет пользователей?

Dazzle 12.04.2021 14:05

Если вы используете базу данных для драйвера сеанса, очистите таблицу сеансов. Повторное создание ключа вызовет множество проблем, если вы используете один логин на многих поддоменах. Очистка сеансовой таблицы помогает уменьшить количество бесполезных данных в сеансовой таблице. Вы можете удалить файлы cookie в браузере любого пользователя.

Другие вопросы по теме