Comanda Artisan pentru ștergerea tuturor datelor de sesiune în Laravel (Programare, Laravel, Sesiune, Laravel Artisan)

Yevgeniy Afanasyev a intrebat.
a intrebat.

Care este comanda artizanală pentru ștergerea tuturor datelor de sesiune în Laravel, caut ceva de genul:

$ php artisan session:clear

Dar se pare că nu există. Cum aș putea să o șterg din linia de comandă?

Am încercat să folosesc

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

Dar aceasta șterge sesiunea unui singur utilizator, vreau să șterg toate sesiunile pentru toți utilizatorii. Cum pot face acest lucru?

Am încercat acest lucru:

artisan cache:clear

Dar nu șterge sesiunea, din nou.

Comentarii

  • Puteți șterge manual din storage/framework/sessions. puteți scrie singur comanda artisan pentru a automatiza acest proces. laravel.com/docs/5.6/artisan#writing-commands –  > Por Khurram Shahzad.
  • Îl am în tabel pe staging și în flie pe local și folosind o singură comandă ar fi mai ușor și mai universal. –  > Por Yevgeniy Afanasyev.
  • Și mi-e lene să execut un Mysql Workbench doar pentru a trunchia un tabel. Durează prea mult să se încarce și prea mulți pași de făcut. –  > Por Yevgeniy Afanasyev.
9 răspunsuri
Devin Gray

UPDATE: Această întrebare pare să fie pusă destul de des și mulți oameni încă o comentează activ.

În practică, este o idee îngrozitoare să se curețe sesiunile folosind opțiunea

php artisan key:generate

Aceasta poate provoca tot felul de ravagii. Cel mai bun mod de a face acest lucru este să ștergeți orice sistem pe care îl utilizați.


Ghidul programatorilor leneși pentru curățarea tuturor sesiunilor:

php artisan key:generate

Va face ca toate sesiunile să devină invalide deoarece este specificată o nouă cheie de aplicație.

Abordarea nu atât de leneșă

php artisan make:command FlushSessions

și apoi introduceți

<?php

namespace AppConsoleCommands;

use IlluminateConsoleCommand;
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();
    }
}

și apoi

php artisan session:flush

Comentarii

  • Vă mulțumim. Acum este chiar mai bine. Acceptat. –  > Por Yevgeniy Afanasyev.
  • Distracție plăcută la deconectarea utilizatorilor 😀 – –  > Por Devin Gray.
  • Rețineți că generarea unei noi chei de aplicație va distruge orice alte date pe care le-ați fi criptat în Laravel. –  > Por Pablo.
  • NU invalidați cheia de aplicații într-o aplicație de producție doar pentru că doriți să scăpați de sesiuni. De asemenea, va face ca toate datele criptate (nu și cele hash) să nu poată fi citite. Poate că aplicația dvs. nu stochează date criptate, dar recomandând-o străinilor pe StackOverflow nu pare a fi o idee bună. –  > Por miho.
  • De asemenea, a doua parte a răspunsului funcționează doar atunci când stocați sesiunile într-o bază de date. Rețineți că, de multe ori, s-ar putea să nu fie cazul (de exemplu, dacă folosiți magazinul de sesiuni Redis sau folosiți magazinul de sesiuni cookie). –  > Por miho.
mitra razmara

Dacă utilizați sesiuni bazate pe fișiere, , puteți utiliza următoarea comandă linux pentru a curăța folderul de sesiuni:

rm -f storage/framework/sessions/*

Comentarii

  • Vă rog, oferiți explicații, adică este în regulă să nu fie un artisan command dar va funcționa doar dacă folosiți un file driver pentru session data, , corect? –  > Por Yevgeniy Afanasyev.
  • Acest lucru șterge, de asemenea, și .gitignore fișier care se află acolo pentru a păstra dosarul (gol) atunci când se face confirmarea. –  > Por Clément Baconnier.
  • @YevgeniyAfanasyev răspunsul a fost actualizat pe baza feedback-ului dvs.  > Por benjaminhull.
miho

O modalitate ușoară de a scăpa de toate sesiunile este de a schimba numele cookie-ului de sesiune. Acest lucru se poate face cu ușurință prin modificarea parametrului 'cookie' => '...' linie în config/session.php fișier.

Acest lucru funcționează independent de stocarea sesiunii pe care o utilizați și, de asemenea, nu va atinge alte date cu excepția datelor de sesiune (și astfel mi se pare preferabilă față de soluția de reînnoire a cheii aplicației, unde ați pierde orice date criptate stocate în aplicație).

Comentarii

  • Frumoasă soluție, mulțumesc. Și aveți dreptate. Site-ul APP_KEY este, de asemenea, o sare pentru hașurile create cu Hash::make(). Deci, parola utilizatorilor și orice alte date hașurate vor fi invalide după modificarea acesteia. –  > Por Algoritm.
  • De ce este mai bine decât schimbarea domain în același fișier? –  > Por Yevgeniy Afanasyev.
  • @algorhythm parolele bcrypt vor continua să funcționeze. Nu sunt sigur de alte algoritmi de hashing de parole. Totuși, aveți dreptate în ceea ce privește coloanele de baze de date hașurate manual care utilizează funcționalitatea de criptare Laravel (deoarece acestea trebuie decriptate, spre deosebire de parole). –  > Por Flame.
jotaelesalinas

Problema este că PHP’s SessionHandlerInterface nu forțează driverele de sesiune să furnizeze niciun fel de destroyAll() metodă. Astfel, aceasta trebuie implementată manual pentru fiecare driver.

Luând idei din diferite răspunsuri, am ajuns la această soluție:

  1. Creați comanda
php artisan make:command FlushSessions 
  1. Creați clasa în app/Console/Commands/FlushSessions.php
<?php

namespace AppConsoleCommands;

use IlluminateConsoleCommand;

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. Executați comanda
php artisan session:flush

Implementările pentru alte drivere sunt binevenite!

Refilon

Știu că acesta este un fir vechi, dar ceea ce a funcționat pentru mine este doar să eliminați cookie-urile.

În Chrome, mergeți la consola de dezvoltare, mergeți la fila „Aplicație”. Găsiți „Cookies” în bara laterală și faceți clic pe săgeata mică din fața ei. Mergeți la numele domeniului dvs. și faceți clic pe pictograma de lângă câmpul de filtrare pentru a șterge cookie-urile pentru domeniul dvs. Actualizați pagina și toate datele sesiunii sunt noi, iar cele vechi sunt eliminate.

Hamees A. Khan

Acest fir este destul de mult mai vechi. Dar aș dori să împărtășesc implementarea mea de eliminare a tuturor sesiunilor pentru driverul bazat pe fișiere.

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

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

De ce nu am folosit comanda linux „rm”?

Pentru că PHP este una dintre condițiile prealabile pentru Laravel, iar Linux nu este. Utilizarea acestei comenzi Linux va face ca proiectul nostru să poată fi implementat doar în mediul Linux.De aceea este bine să folosim PHP în Laravel.

Nur Uddin

Dacă folosiți o sesiune de bază de date , trebuie doar să ștergeți toate datele din acel tabel. în cazul meu este vorba de tabelul „sesiuni”.

Etta

Dacă folosiți baza de date pentru driverul de sesiune, atunci goliți tabelul sesiuni. Regenerarea cheii va cauza o mulțime de probleme dacă utilizați o singură autentificare pe mai multe subdomenii. Golirea tabelului de sesiuni ajută la reducerea datelor inutile din tabelul de sesiuni. Puteți șterge cookie-urile de pe browserul fiecăruia.

Murat Çakmak

Soluția meaLaravel