Laravel 5 - Svuota la cache nel server di hosting condiviso


125

La domanda è abbastanza chiara.

php artisan cache:clear

C'è qualche soluzione alternativa per svuotare la cache come sopra che usiamo nella CLI. Sto utilizzando un popolare servizio di hosting condiviso, ma secondo il mio piano, non ho accesso al pannello di controllo.

** Voglio svuotare la cache delle visualizzazioni. **

Ho visto una domanda quasi uguale a questa, ma non mi aiuta.


2
Eseguire Laravel sull'hosting condiviso è folle, IMO, proprio per questo tipo di motivo. Come stai eseguendo le migrazioni?
ceejayoz

@ceejayoz .. In realtà ho appena iniziato questo progetto, ed è anche il mio primo progetto Laravel. Non sono ancora venuto a questa faccenda della migrazione ..
Rinto George

11
"Eseguire Laravel su un hosting condiviso è una follia" @ceejayoz ... Ma questo è il mondo reale. A volte devi perché non c'è scelta.
elb98rm

2
@ elb98rm Un VPS di Digital Ocean parte da $ 5 / mese. C'è sempre una scelta, incluso non lavorare per un cliente che non è disposto a pagare $ 5 al mese per l'hosting.
ceejayoz

19
@ceejayoz Non pertinente: spesso ho lavorato per luoghi in cui non sono i soldi, ma la relazione o l'ospite e la politica interna. Inoltre, a volte non dipende letteralmente dal tuo intero dipartimento. Il mondo reale significa che a volte devi lavorare con una situazione. Sei fortunato o protetto se non hai mai dovuto lavorare con le scelte di un'altra persona ...
elb98rm

Risposte:


146

Puoi chiamare un comando Artisan al di fuori della CLI.

Route::get('/clear-cache', function() {
    $exitCode = Artisan::call('cache:clear');
    // return what you want
});

Puoi controllare il documento ufficiale qui http://laravel.com/docs/5.0/artisan#calling-commands-outside-of-cli


Aggiornare

Non è possibile eliminare la cache di visualizzazione. Néphp artisan cache:clear quello.

Se vuoi davvero svuotare la cache della vista, penso che devi scriverne una tua artisan comando e chiamarlo come ho detto prima, oppure saltare completamente il artisanpercorso e svuotare la cache della vista in una classe che chiami da un controller o da una rotta.

Ma la mia vera domanda è : hai davvero bisogno di svuotare la cache di visualizzazione ? In un progetto su cui sto lavorando ora, ho quasi 100 visualizzazioni in cache e pesano meno di 1 Mb, mentre la mia vendordirectory è> 40 Mb. Non penso che la cache di visualizzazione sia un vero collo di bottiglia nell'utilizzo del disco e non ho mai avuto un reale bisogno di cancellarla.

Per quanto riguarda la cache dell'applicazione , è memorizzata nella storage/framework/cachedirectory, ma solo se hai configurato il filedriver in config/cache.php. Puoi scegliere molti driver diversi, come Redis o Memcached , per migliorare le prestazioni su una cache basata su file.


1
Quale cache stai cercando di cancellare? Il cache:clearcomando funziona con la cache dell'applicazione , quella a cui si accede dalla Cachefacciata.
Marco Pallante

Voglio svuotare la cache di visualizzazione, ci sono molte pagine salvate nella cartella della cache di visualizzazione. Un'altra domanda, quando dice cache dell'applicazione, quali sono tutte le directory a cui si rivolge.
Rinto George

Grazie per la spiegazione!. Non sono preoccupato per lo spazio su disco :) Ma una domanda se la cache di visualizzazione non si cancella, allora come le nuove modifiche in vista hanno effetto nel sito web, è che qualche controllo I / O sta avvenendo in laravel?
Rinto George

1
Penso che esegua un controllo del timestamp sui file, che è più veloce della ricostruzione del modello blade
Marco Pallante

Sì, credo di sì, comunque mi hai aiutato a pensare nel modo giusto, grazie!
Rinto George

61

Spero che questo aiuti qualcuno

Vai a laravelFolder/bootstrap/cachequindi rinomina config.phpcome vuoi, ad es. config.php_olde ricarica il tuo sito. Dovrebbe funzionare come il voodoo.

Buona programmazione ...


Confermo. Funziona in laravel 5.4. Mi inchino.
simon

1
L'unica e sola soluzione! Se ti chiedi perché funziona? solo dio lo sa
Luis Contreras

Confermato che cancella il dolore nell'asino mentre ospita laravel 5.4 da windows a hosting condiviso .... GRAZIE !!!
Rikudo Pain

Sembra che in alcuni scenari questa sia l'unica soluzione che funziona. Se si dispone di una configurazione memorizzata nella cache e quindi si rimuove una facciata o un provider di servizi, quando si esegue il comando per creare la nuova configurazione memorizzata nella cache, viene eseguita utilizzando la configurazione memorizzata nella cache esistente e tenta di fare riferimento alle classi Facade e / o provider di servizi che non esistono più e falliscono. L'altra opzione sarebbe quella di rimuovere i riferimenti dal file di configurazione, rigenerare la configurazione memorizzata nella cache, quindi rimuovere le classi Facade e / o Service Provider effettive.
Jason Wheeler,

1
Per Laravel 6.6, per rimuovere la cache, ho appena rimosso la cachecartella e .envil valore della cache predefinito del file. Ma dopo aver eliminato tutto questo problema ancora una volta .. quando php artisan optimize. Infine questo ha risolto il mio problema, non rinominando ma cambiando il valore della chiave nel file config.php. Grazie @DeadGuy
Chandan Sharma

49

Come posso vedere: http://itsolutionstuff.com/post/laravel-5-clear-cache-from-route-view-config-and-all-cache-data-from-applicationexample.html

è possibile utilizzare il codice seguente con i nuovi comandi di cancellazione della cache:

//Clear Cache facade value:
Route::get('/clear-cache', function() {
    $exitCode = Artisan::call('cache:clear');
    return '<h1>Cache facade value cleared</h1>';
});

//Reoptimized class loader:
Route::get('/optimize', function() {
    $exitCode = Artisan::call('optimize');
    return '<h1>Reoptimized class loader</h1>';
});

//Route cache:
Route::get('/route-cache', function() {
    $exitCode = Artisan::call('route:cache');
    return '<h1>Routes cached</h1>';
});

//Clear Route cache:
Route::get('/route-clear', function() {
    $exitCode = Artisan::call('route:clear');
    return '<h1>Route cache cleared</h1>';
});

//Clear View cache:
Route::get('/view-clear', function() {
    $exitCode = Artisan::call('view:clear');
    return '<h1>View cache cleared</h1>';
});

//Clear Config cache:
Route::get('/config-cache', function() {
    $exitCode = Artisan::call('config:cache');
    return '<h1>Clear Config cleared</h1>';
});

Non è necessario dare la possibilità di cancellare le cache a tutti, soprattutto in un ambiente di produzione, quindi suggerisco di commentare quelle rotte e, quando è necessario, de-commentare il codice ed eseguire le rotte.


1
Ho trovato questo snippet molto utile.
Haseeb Zulfiqar

Ho un problema con la configurazione: la cache non funziona nella route o nel controller ma altri funzionano. quale sarebbe il problema?
Nayeem

40

Memorizzazione nella cache della configurazione La configurazione di laravel si diffonde in dozzine di file e includingognuno di essi per ciascuna richiesta è un processo costoso. Per combinare tutti i tuoi file di configurazione in uno, usa:

php artisan config:cache

Tieni presente che qualsiasi modifica alla configurazione non avrà alcun effetto una volta memorizzata nella cache. Per aggiornare la cache di configurazione, eseguire nuovamente il comando precedente. Nel caso in cui desideri eliminare completamente la cache di configurazione, esegui

php artisan config:clear

Caching delle rotte Anche l' instradamento è un'attività costosa in laravel. Per memorizzare nella cache il file routes.php eseguire il comando seguente:

php artisan route:cache

Ricorda che non funziona con le chiusure. Nel caso in cui tu stia usando le chiusure, questa è una grande opportunità per spostarle in un controller, poiché il comando artisan genererà un'eccezione quando si tenta di compilare rotte che sono vincolate a chiusure invece di metodi di controller appropriati. Come per la cache di configurazione, qualsiasi modifica a route.php non avrà più alcun effetto. Per aggiornare la cache, esegui il comando precedente ogni volta che apporti una modifica al file dei percorsi. Per eliminare completamente la cache del percorso, esegui il comando seguente:

php artisan route:clear

Ottimizzazione della mappa di classe

Non è raro che un progetto di medie dimensioni venga distribuito su centinaia di file PHP. Come ci impongono i buoni comportamenti di codifica, ogni cosa ha il suo file. Questo, ovviamente, non è privo di inconvenienti. Laravel deve includere dozzine di file diversi per ogni richiesta, il che è una cosa costosa da fare.

Quindi, un buon metodo di ottimizzazione è dichiarare quali file vengono utilizzati per ogni richiesta (questo è, ad esempio, tutti i provider di servizi, middleware e pochi altri) e combinarli in un solo file, che verrà successivamente caricato per ogni richiesta. Questo non è diverso dal combinare tutti i tuoi file javascript in uno, quindi il browser dovrà fare meno richieste al server.

I file di compilazione aggiuntivi (di nuovo: fornitori di servizi, middleware e così via) dovrebbero essere dichiarati da te in config / compile.php, nella chiave files. Una volta messo lì tutto l'essenziale per ogni richiesta fatta alla tua app, concatenali in un unico file con:

php artisan optimize --force

Ottimizzazione del caricamento automatico del compositore

Questo non è solo per laravel, ma per qualsiasi applicazione che fa uso di composer.

Spiegherò prima come funziona l'autoload della PSR-4, poi ti mostrerò quale comando dovresti eseguire per ottimizzarlo. Se non sei interessato a sapere come funziona il compositore, ti consiglio di passare direttamente al comando della console.

Quando chiedi al compositore la App\Controllers\AuthControllerclasse, prima cerca un'associazione diretta nella mappa della classe. La mappa di classe è un array con associazioni 1 a 1 di classi e file. Poiché, ovviamente, non hai aggiunto manualmente la classe Login e il suo file associato alla mappa di classe, il compositore andrà avanti e cercherà negli spazi dei nomi. Poiché App è uno spazio dei nomi PSR-4, fornito di default con Laravel ed è associato alla app/cartella, il compositore proverà a convertire il nome della classe PSR-4 in un nome file con procedure di manipolazione di stringhe di base. Alla fine, suppone che App\Controllers\AuthControllerdebba trovarsi in un file AuthController.php, che si trova in una Controllers/cartella che dovrebbe essere fortunatamente nella cartella dello spazio dei nomi, che èapp/ .

Tutto questo duro lavoro solo per ottenere che la App\Controllers\AuthControllerclasse esista nel app/Controllers/AuthController.phpfile. Per fare in modo che il compositore esegua la scansione dell'intera applicazione e crei associazioni dirette 1 a 1 di classi e file, eseguire il comando seguente:

composer dumpautoload -o

Tieni presente che se hai già eseguito php artisan optimisation --force, non devi più eseguire questo. Poiché il comando di ottimizzazione dice già al compositore di creare un caricamento automatico ottimizzato.


30

Questo pacchetto è per php ^ 7.0 e ^ laravel5.5 .

Usa questo pacchetto in cronjob che ho creato solo a questo scopo. Anch'io stavo affrontando la stessa situazione. https://packagist.org/packages/afrazahmad/clear-cached-data Installalo ed esegui:

php artisan clear:data

ed eseguirà automaticamente i seguenti comandi

php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan clear-compiled
php artisan config:cache

Spero che sia d'aiuto.

Se vuoi eseguirlo automaticamente in un momento specifico, dovrai prima configurare crnjob. per esempio

 in app/console/kernel.php

In funzione di pianificazione:

$schedule->command('clear:data')->dailyAt('07:00');

17

Fondamentalmente voglio cancellare la cache delle visualizzazioni.

Ora c'è un comando in Laravel 5.1 per questo

php artisan view:clear

9

Puoi connetterti tramite FTP e cancellare la storage\framework\viewscartella per laravel 5o app\storage\viewsper laravel 4.


7

Per cancellare tutta la cache al di fuori della CLI , eseguire questa operazione; Questo funziona per me.

Route::get('/clear', function() {

   Artisan::call('cache:clear');
   Artisan::call('config:clear');
   Artisan::call('config:cache');
   Artisan::call('view:clear');

   return "Cleared!";

});

config:cachesi cancellerà e la configurazione della cache - quindi immagino che non sia necessario aggiungere entrambi
Raja Khoury

sicuro. devi solo usare la linea che ti serve.
Amos Chihi

4
php artisan view:clear

cancellerà le visualizzazioni nella cache


php artisan cache:clear Viene richiesta l'alternativa al comando . Ciò non cancellerà la cache visualizzata memorizzata nella cartella di archiviazione, che è esattamente ciò che è necessario.
Spidi

2

Puoi farlo se stai usando Lumendal Laraveltuo routes/web.phpfile:

use Illuminate\Support\Facades\Artisan;

$app->get('/clear-cache', function () {
    $code = Artisan::call('cache:clear');
    return 'cache cleared';
});

1

Puoi farlo anche tramite router, simile alla risposta di Francesco ma con meno disordine nella configurazione del router

Route::get('/artisan/{cmd}', function($cmd) {
    $cmd = trim(str_replace("-",":", $cmd));
    $validCommands = ['cache:clear', 'optimize', 'route:cache', 'route:clear', 'view:clear', 'config:cache'];
    if (in_array($cmd, $validCommands)) {
        Artisan::call($cmd);
        return "<h1>Ran Artisan command: {$cmd}</h1>";
    } else {
        return "<h1>Not valid Artisan command</h1>";
    }
});

Quindi eseguili visitando http: //myapp.test/artisan/cache-clear ecc. Se devi aggiungere / modificare comandi Artisan validi, aggiorna semplicemente l'array $ validCommands.


1

Questo ha funzionato per me. Nel tuo progetto vai a: storage> framework> views. Elimina tutti i file presenti e aggiorna la pagina.



1

Ho utilizzato questa pagina alcune volte per copiare e incollare comandi rapidi nel compositore, quindi ho scritto un comando che esegue questi comandi in un unico comando artigianale.

namespace App\Console\Commands\Admin;

use Illuminate\Console\Command;

class ClearEverything extends Command
{

    protected $signature = 'traqza:clear-everything';

    protected $description = 'Clears routes, config, cache, views, compiled, and caches config.';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        $validCommands = array('route:clear', 'config:clear', 'cache:clear', 'view:clear', 'clear-compiled', 'config:cache');
        foreach ($validCommands as $cmd) {
            $this->call('' . $cmd . '');

        }
    }
}

Luogo in app\Console\Commands\Admin cartella

quindi esegui il comando nel compositore php artisan traqza:clear-everything

Buona codifica.

Github -> https://github.com/Traqza/clear-everything


0

Anche se sono fortemente in disaccordo con l'idea di eseguire un'app Laravel su hosting condiviso (una cattiva idea in tutto e per tutto), questo pacchetto probabilmente risolverebbe il tuo problema. È un pacchetto che ti permette di eseguire alcuni comandi artigianali dal web. È tutt'altro che perfetto, ma può funzionare per alcuni casi d'uso.

https://github.com/recca0120/laravel-terminal



0

Credo che l'approccio più efficiente a questo sia utilizzare il modulo cron job nel pannello di amministrazione del server condiviso per eseguire il comando dello scheduler laravel che a sua volta chiamerà il comando artisan configurato, qualcosa del genere dovrebbe fare il lavoro:

* * * * * /usr/bin/php /var/www/web/artisan schedule:run /dev/null 2>&1

Con la configurazione dello scheduler in cron, puoi modificare il metodo di pianificazione in \ App \ Console \ Kernel.php per chiamare il comando artisan giusto, qualcosa del genere:

$schedule->command('queue:work')->cron('* * * * *')->withoutOverlapping();
$schedule->command('route:cache')->cron('0 0 * * *')->withoutOverlapping();

È sempre possibile eliminare le righe sopra dopo l'esecuzione dei comandi

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.