Laravel 5 - Cache im Shared Hosting Server löschen

125

Die Frage ist ziemlich klar.

php artisan cache:clear

Gibt es eine Problemumgehung, um den Cache wie oben in CLI zu löschen? Ich verwende einen beliebten Shared Hosting-Dienst, habe aber gemäß meinem Plan keinen Zugriff auf das Control Panel.

** Ich möchte den Ansichts-Cache leeren. **

Ich habe eine fast gleiche Frage gesehen , aber sie hilft mir nicht.

Rinto George
quelle
2
Das Ausführen von Laravel auf Shared Hosting ist aus genau diesem Grund verrückt, IMO. Wie führen Sie Migrationen durch?
Ceejayoz
@ceejayoz .. Eigentlich habe ich gerade dieses Projekt gestartet und es ist auch mein erstes Laravel-Projekt. Ich bin noch nicht zu dieser Migrationssache gekommen.
Rinto George
11
"Laravel auf Shared Hosting laufen zu lassen ist verrückt" @ceejayoz ... Aber das ist die reale Welt. Manchmal muss man, weil es keine Wahl gibt.
Elb98rm
2
@ elb98rm Ein VPS von Digital Ocean beginnt bei 5 USD / Monat. Es gibt immer die Wahl, auch nicht für einen Kunden zu arbeiten, der nicht bereit ist, 5 US-Dollar pro Monat für das Hosting zu zahlen.
Ceejayoz
19
@ceejayoz Nicht relevant - oft habe ich für Orte gearbeitet, an denen es nicht um Geld, Beziehung oder Gastgeber und Innenpolitik geht. Außerdem - manchmal liegt es buchstäblich nicht an Ihrer gesamten Abteilung. Die reale Welt bedeutet, dass Sie manchmal mit einer Situation arbeiten müssen. Sie haben Glück oder sind geschützt, wenn Sie noch nie mit den Entscheidungen einer anderen Person arbeiten mussten ...
elb98rm

Antworten:

146

Sie können einen Artisan-Befehl außerhalb der CLI aufrufen.

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

Sie können das offizielle Dokument hier http://laravel.com/docs/5.0/artisan#calling-commands-outside-of-cli überprüfen


Aktualisieren

Es gibt keine Möglichkeit, den Ansichtscache zu löschen. Das php artisan cache:cleartut es auch nicht.

Wenn Sie den Ansichts-Cache wirklich löschen möchten, müssen Sie Ihren eigenen artisanBefehl schreiben und ihn wie oben beschrieben aufrufen oder den artisanPfad vollständig überspringen und den Ansichts-Cache in einer Klasse löschen, die Sie von einem Controller oder einer Route aus aufrufen.

Meine eigentliche Frage ist jedoch, ob Sie den Ansichts-Cache wirklich leeren müssen . In einem Projekt, an dem ich gerade arbeite, habe ich fast 100 zwischengespeicherte Ansichten und sie wiegen weniger als 1 MB, während mein vendorVerzeichnis> 40 MB ist. Ich denke nicht, dass der Ansichts-Cache ein echter Engpass bei der Festplattennutzung ist und nie wirklich gelöscht werden musste.

Der Anwendungscache wird im storage/framework/cacheVerzeichnis gespeichert , jedoch nur, wenn Sie den fileTreiber in konfiguriert haben config/cache.php. Sie können viele verschiedene Treiber wie Redis oder Memcached auswählen , um die Leistung gegenüber einem dateibasierten Cache zu verbessern.

Marco Pallante
quelle
1
Welchen Cache versuchen Sie zu leeren? Der cache:clearBefehl arbeitet mit dem Anwendungscache , auf den von der CacheFassade aus zugegriffen wird .
Marco Pallante
Ich möchte den Ansichts-Cache leeren. Es sind viele Seiten im Ansichts-Cache-Ordner gespeichert. Noch eine Frage, wenn es um Anwendungscache geht, bei dem es sich um alle Verzeichnisse handelt, auf die es abzielt.
Rinto George
Danke für die Erklärung!. Ich mache mir keine Sorgen um den Speicherplatz auf den Festplatten :) Aber eine Frage, wenn der Ansichtscache nicht geleert wird, wie sich die neuen Änderungen in der Ansicht auf die Website auswirken, ist, dass eine E / A-Überprüfung in Laravel stattfindet?
Rinto George
1
Ich denke, es führt eine Zeitstempelprüfung für Dateien durch, die schneller ist als die
Marco Pallante
Ja, ich denke schon, trotzdem hast du mir geholfen, richtig zu denken, danke!
Rinto George
61

Ich hoffe das hilft jemandem

Gehen Sie zu laravelFolder/bootstrap/cacheund benennen config.phpSie dann in etwas um, das Sie möchten, z. config.php_oldund laden Sie Ihre Website neu. Das sollte wie Voodoo funktionieren.

Viel Spaß beim Codieren ...

Der Tote
quelle
Ich bestätige. Funktioniert in Laravel 5.4. Ich verneige mich.
Simon
1
Die einzige Lösung! Wenn Sie sich fragen, warum funktioniert? Nur Gott weiß
Luis Contreras
Bestätigt, dass es den Schmerz in der A ** beim Hosten von Laravel 5.4 von Windows zu Shared Hosting abwischt .... DANKE !!!
Rikudo Pain
In einigen Szenarien scheint dies die einzige Lösung zu sein, die funktioniert. Wenn Sie eine zwischengespeicherte Konfiguration haben und dann eine Fassade oder einen Dienstanbieter entfernen, wird der Befehl zum Erstellen der neuen zwischengespeicherten Konfiguration unter Verwendung der vorhandenen zwischengespeicherten Konfiguration ausgeführt und versucht, auf die Facade- und / oder Dienstanbieterklassen zu verweisen, die nicht mehr existieren und scheitert. Die andere Möglichkeit besteht darin, die Referenzen aus der Konfigurationsdatei zu entfernen, die zwischengespeicherte Konfiguration neu zu generieren und dann die tatsächlichen Facade- und / oder Service Provider-Klassen zu entfernen.
Jason Wheeler
1
Für Laravel 6.6 habe ich zum Entfernen des Cachings den cacheOrdner und den .envStandard-Cache-Wert der Datei entfernt . Aber nach dem Löschen all dieser Probleme immer wieder .. wann php artisan optimize. Schließlich löste dieses mein Problem, nicht durch Umbenennen, sondern durch Ändern des Schlüsselwerts in der Datei config.php. Vielen Dank @DeadGuy
Chandan Sharma
49

Wie ich sehen kann: http://itsolutionstuff.com/post/laravel-5-clear-cache-from-route-view-config-and-all-cache-data-from-applicationexample.html

Ist es möglich, den folgenden Code mit den neuen Befehlen zum Löschen des Cache zu verwenden:

//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>';
});

Es ist nicht erforderlich, die Möglichkeit zu geben, die Caches für alle zu löschen, insbesondere in einer Produktionsumgebung. Daher empfehle ich, diese Routen zu kommentieren und bei Bedarf den Code zu dekommentieren und die Routen auszuführen.

Francesco
quelle
1
Ich fand dieses Snippet am hilfreichsten.
Haseeb Zulfiqar
Ich habe ein Problem mit config: Cache funktioniert nicht in Route oder Controller, aber andere funktionieren. Was wäre ein Problem?
Nayeem
40

Konfigurations-Caching Die Laravel-Konfiguration erstreckt sich über Dutzende von Dateien, und includingjede einzelne für jede Anforderung ist ein kostspieliger Prozess. Verwenden Sie Folgendes, um alle Konfigurationsdateien in einer zu kombinieren:

php artisan config:cache

Beachten Sie, dass Änderungen an der Konfiguration nach dem Zwischenspeichern keine Auswirkungen mehr haben. Führen Sie den obigen Befehl erneut aus, um den Konfigurationscache zu aktualisieren. Wenn Sie den Konfigurationscache vollständig entfernen möchten, führen Sie ihn aus

php artisan config:clear

Routing- Caching Routing ist auch in Laravel eine teure Aufgabe. Führen Sie den folgenden Befehl aus, um die Datei route.php zwischenzuspeichern:

php artisan route:cache

Beachten Sie, dass es mit Verschlüssen nicht funktioniert. Wenn Sie Closures verwenden, ist dies eine gute Möglichkeit, diese in einen Controller zu verschieben, da der Befehl artisan eine Ausnahme auslöst, wenn versucht wird, Routen zu kompilieren, die an Closures gebunden sind, anstatt geeignete Controller-Methoden. Wie im Konfigurationscache haben Änderungen an route.php keine Auswirkungen mehr. Führen Sie den obigen Befehl jedes Mal aus, wenn Sie Änderungen an der Routendatei vornehmen, um den Cache zu aktualisieren. Führen Sie den folgenden Befehl aus, um den Routen-Cache vollständig zu entfernen:

php artisan route:clear

Klassenkartenoptimierung

Es ist nicht ungewöhnlich, dass ein mittelgroßes Projekt auf Hunderte von PHP-Dateien verteilt ist. Wie es uns ein gutes Codierungsverhalten vorschreibt, hat alles seine eigene Datei. Dies ist natürlich nicht ohne Nachteile. Laravel muss für jede Anfrage Dutzende verschiedener Dateien einschließen, was eine kostspielige Sache ist.

Eine gute Optimierungsmethode besteht daher darin, zu deklarieren, welche Dateien für jede Anforderung verwendet werden (dies sind beispielsweise alle Ihre Dienstanbieter, Middlewares und einige weitere), und diese in nur einer Datei zu kombinieren, die anschließend für jede Anforderung geladen wird. Dies unterscheidet sich nicht von der Kombination aller Ihrer Javascript-Dateien zu einer, sodass der Browser weniger Anforderungen an den Server stellen muss.

Die zusätzlichen Kompilierungsdateien (wieder: Dienstanbieter, Middlewares usw.) sollten von Ihnen in config / compile.php im Dateischlüssel deklariert werden. Wenn Sie dort alles Notwendige für jede Anfrage an Ihre App abgelegt haben, verknüpfen Sie sie in einer Datei mit:

php artisan optimize --force

Optimieren des automatischen Ladens des Komponisten

Dieser ist nicht nur für Laravel gedacht, sondern für jede Anwendung, die Composer verwendet.

Ich werde zuerst erklären, wie das automatische Laden des PSR-4 funktioniert, und dann werde ich Ihnen zeigen, welchen Befehl Sie ausführen sollten, um es zu optimieren. Wenn Sie nicht wissen möchten, wie Composer funktioniert, empfehlen wir Ihnen, direkt zum Konsolenbefehl zu springen.

Wenn Sie den Komponisten nach der App\Controllers\AuthControllerKlasse fragen , sucht er zuerst nach einer direkten Zuordnung in der Klassenzuordnung. Die Klassenzuordnung ist ein Array mit 1: 1-Zuordnungen von Klassen und Dateien. Da Sie die Login-Klasse und die zugehörige Datei natürlich nicht manuell zur Klassenzuordnung hinzugefügt haben, fährt Composer fort und sucht in den Namespaces. Da App ein PSR-4-Namespace ist, der standardmäßig mit Laravel geliefert wird und dem app/Ordner zugeordnet ist, versucht Composer, den PSR-4-Klassennamen mit grundlegenden Verfahren zur Zeichenfolgenmanipulation in einen Dateinamen zu konvertieren. Am Ende wird vermutet, App\Controllers\AuthControllerdass sich diese in einer AuthController.php-Datei befinden muss, die sich in einem Controllers/Ordner befindet, der sich zum Glück im Namespace-Ordner befinden sollte app/.

All diese harte Arbeit nur, um sicherzustellen, dass die App\Controllers\AuthControllerKlasse in der app/Controllers/AuthController.phpDatei vorhanden ist. Führen Sie den folgenden Befehl aus, damit Composer Ihre gesamte Anwendung scannt und direkte 1: 1-Zuordnungen von Klassen und Dateien erstellt:

composer dumpautoload -o

Denken Sie daran, dass Sie diese nicht mehr ausführen müssen, wenn Sie PHP Artisan Optimize --force bereits ausgeführt haben. Da der Befehl optimize den Komponisten bereits anweist, ein optimiertes Autoload zu erstellen.

Maulik
quelle
29

Dieses Paket ist für PHP ^ 7.0 und ^ Laravel5.5 .

Verwenden Sie dieses Paket in Cronjob , den ich nur für diesen Zweck erstellt habe. Ich war auch mit der gleichen Situation konfrontiert. https://packagist.org/packages/afrazahmad/clear-cached-data Installieren Sie es und führen Sie es aus:

php artisan clear:data

Die folgenden Befehle werden automatisch ausgeführt

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

Ich hoffe es hilft.

Wenn Sie es zu einem bestimmten Zeitpunkt automatisch ausführen möchten, müssen Sie zuerst crnjob einrichten. z.B

 in app/console/kernel.php

In der Zeitplanfunktion:

$schedule->command('clear:data')->dailyAt('07:00');
Afraz Ahmad
quelle
17

Grundsätzlich möchte ich den Ansichts-Cache leeren.

Dafür gibt es jetzt in Laravel 5.1 einen Befehl

php artisan view:clear
Laurence
quelle
9

Sie können eine Verbindung über FTP herstellen und den storage\framework\viewsOrdner für laravel 5oder app\storage\viewsfür löschen laravel 4.

gandra404
quelle
7

Gehen Sie folgendermaßen vor , um den gesamten Cache außerhalb der CLI zu löschen . Das funktioniert bei mir.

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

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

   return "Cleared!";

});
Amos Chihi
quelle
config:cachewird die Konfiguration löschen und zwischenspeichern - ich denke, es ist nicht nötig, beide hinzuzufügen
Raja Khoury
sicher. Sie verwenden nur die gewünschte Leitung.
Amos Chihi
4
php artisan view:clear

löscht die zwischengespeicherten Ansichten

Spidi
quelle
Die Alternative zum Befehl php artisan cache:clear wird gefragt. Dadurch wird der im Speicherordner gespeicherte angezeigte Cache nicht gelöscht. Dies ist genau das, was benötigt wird.
Spidi
2

Sie können dies tun, wenn Sie Lumenvon Laravelin Ihrer routes/web.phpDatei verwenden:

use Illuminate\Support\Facades\Artisan;

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

Sie können dies auch über einen Router tun, ähnlich wie bei Francesco, jedoch mit weniger Unordnung in der Routerkonfiguration

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>";
    }
});

Führen Sie sie dann über http: //myapp.test/artisan/cache-clear usw. aus. Wenn Sie gültige Artisan-Befehle hinzufügen / bearbeiten müssen, aktualisieren Sie einfach das Array $ validCommands.

chemic
quelle
1

Das hat bei mir funktioniert. Gehen Sie in Ihrem Projekt zu: Speicher> Framework> Ansichten. Löschen Sie alle Dateien dort und aktualisieren Sie Ihre Seite.

rogramatisch
quelle
1

Ich habe diese Seite einige Male verwendet, um Schnellbefehle zu kopieren und in den Composer einzufügen. Daher habe ich einen Befehl geschrieben, der diese Befehle in einem einzigen handwerklichen Befehl ausführt.

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 . '');

        }
    }
}

In app\Console\Commands\AdminOrdner legen

Führen Sie dann den Befehl in Composer aus php artisan traqza:clear-everything

Viel Spaß beim Codieren.

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

lzoesch
quelle
0

Obwohl ich der Idee, eine Laravel-App auf Shared Hosting auszuführen, überhaupt nicht zustimme (eine schlechte Idee), würde dieses Paket wahrscheinlich Ihr Problem lösen. Es ist ein Paket, mit dem Sie einige handwerkliche Befehle aus dem Web ausführen können. Es ist alles andere als perfekt, kann aber für einige Anwendungsfälle funktionieren.

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

Ben Yanke
quelle
0

Ich glaube, der effizientere Ansatz besteht darin, das Cron-Jobmodul im Admin-Bereich des gemeinsam genutzten Servers zu verwenden, um den Laravel-Scheduler-Befehl auszuführen, der wiederum den konfigurierten Artisan-Befehl aufruft. So etwas sollte den Job erledigen:

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

Mit dem Scheduler-Setup in cron können Sie die Schedule-Methode in \ App \ Console \ Kernel.php bearbeiten , um den richtigen handwerklichen Befehl aufzurufen.

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

Sie können die obigen Zeilen jederzeit löschen, nachdem die Befehle ausgeführt wurden

korwalskiy
quelle