Laravel 5 - Wyczyść pamięć podręczną na współdzielonym serwerze hostingowym

125

Pytanie jest całkiem jasne.

php artisan cache:clear

Czy jest jakieś obejście, aby wyczyścić pamięć podręczną, jak powyżej, którego używamy w CLI. Korzystam z popularnej usługi hostingu współdzielonego, ale zgodnie z moim planem nie mam dostępu do panelu sterowania.

** Chcę wyczyścić pamięć podręczną widoków. **

Widziałem pytanie prawie takie samo jak to, ale to mi nie pomaga.

Rinto George
źródło
2
Uruchamianie Laravel na hostingu współdzielonym jest szalone, IMO, właśnie z tego powodu. Jak przebiega migracja?
ceejayoz
@ceejayoz .. Właściwie to właśnie zacząłem ten projekt i jest to również mój pierwszy projekt laravel. Nie przyszedłem jeszcze do tej migracji…
Rinto George,
11
„Uruchamianie Laravel na hostingu współdzielonym jest szalone” @ceejayoz ... Ale to jest prawdziwy świat. Czasami musisz, bo nie ma wyboru.
elb98rm
2
@ elb98rm VPS firmy Digital Ocean zaczyna się od 5 USD / miesiąc. Zawsze jest wybór, w tym brak pracy dla klienta, który nie chce płacić 5 USD miesięcznie za hosting.
ceejayoz
19
@ceejayoz Nie dotyczy - często pracowałem w miejscach, w których nie chodzi o pieniądze, chodzi o związek, gospodarza i politykę wewnętrzną. Co więcej - czasami dosłownie nie zależy to od całego działu. Prawdziwy świat oznacza, że ​​czasami musisz popracować nad sytuacją. Masz szczęście lub ochronę, jeśli nigdy nie
musiałeś

Odpowiedzi:

146

Możesz wywołać polecenie rzemieślnika poza CLI.

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

Możesz sprawdzić oficjalny dokument tutaj http://laravel.com/docs/5.0/artisan#calling-commands-outside-of-cli


Aktualizacja

Nie ma możliwości usunięcia pamięci podręcznej widoku. Aniphp artisan cache:clear tego robi.

Jeśli naprawdę chcesz wyczyścić pamięć podręczną widoku, myślę, że musisz napisać własną artisan polecenie i wywołać je, jak powiedziałem wcześniej, lub całkowicie pominąć artisanścieżkę i wyczyścić pamięć podręczną widoku w jakiejś klasie, którą wywołujesz z kontrolera lub trasy.

Ale moje prawdziwe pytanie brzmi: czy naprawdę musisz wyczyścić pamięć podręczną widoku ? W projekcie, nad którym teraz pracuję, mam prawie 100 widoków w pamięci podręcznej i ważą mniej niż 1 Mb, podczas gdy mój vendorkatalog ma rozmiar> 40 Mb. Nie sądzę, aby pamięć podręczna widoku była prawdziwym wąskim gardłem w korzystaniu z dysku i nigdy nie miała prawdziwej potrzeby jej wyczyszczenia.

Jeśli chodzi o pamięć podręczną aplikacji , jest ona przechowywana w storage/framework/cachekatalogu, ale tylko wtedy, gdy skonfigurowałeś filesterownik w config/cache.php. Możesz wybrać wiele różnych sterowników, takich jak Redis lub Memcached , aby poprawić wydajność w pamięci podręcznej opartej na plikach.

Marco Pallante
źródło
1
Jaką pamięć podręczną próbujesz wyczyścić? cache:clearKomenda działa z pamięci podręcznej aplikacji , ten, który jest dostępne z Cacheelewacji.
Marco Pallante,
Chcę wyczyścić pamięć podręczną widoku, jest wiele stron zapisanych w folderze pamięci podręcznej widoku. Jeszcze jedno pytanie, kiedy mówi pamięć podręczna aplikacji, czyli wszystkie katalogi, na które jest skierowany.
Rinto George,
Dziękuję za wyjaśnienie!. Nie martwię się o miejsce na dyskach :) Ale jedno pytanie, jeśli pamięć podręczna widoku nie czyści się, to jak nowe zmiany widoku wpływają na witrynę, czy w programie laravel ma miejsce jakiekolwiek sprawdzenie we / wy?
Rinto George,
1
Myślę, że robi znacznik czasu na sprawdzanie plików, który jest szybszy niż odbudowa szablon ostrza
Marco Pallante
Tak, chyba tak, w każdym razie pomogłeś mi myśleć we właściwy sposób, dzięki!
Rinto George,
61

Mam nadzieję, że to komuś pomoże

Przejdź do, laravelFolder/bootstrap/cachea następnie zmień nazwę config.phpna dowolną, np. config.php_oldi przeładuj witrynę. To powinno działać jak voodoo.

Miłego kodowania ...

The Dead Guy
źródło
Potwierdzam. Działa w Laravel 5.4. Kłaniam się.
simon
1
Jedyne rozwiązanie! Jeśli zastanawiasz się, dlaczego działa? tylko Bóg wie
Luis Contreras
Potwierdzone, że usuwa ból w ** podczas hostowania laravel 5.4 z systemu Windows do hostingu współdzielonego .... DZIĘKUJĘ !!!
Rikudo Pain
Wydaje się, że w kilku scenariuszach jest to jedyne rozwiązanie, które działa. Jeśli masz konfigurację w pamięci podręcznej, a następnie usuniesz elewację lub dostawcę usług, po uruchomieniu polecenia w celu utworzenia nowej konfiguracji w pamięci podręcznej działa ono przy użyciu istniejącej konfiguracji z pamięci podręcznej i próbuje odwołać się do klas fasady i / lub dostawcy usług, które już nie istnieje i zawodzi. Inną opcją byłoby usunięcie odniesień z pliku konfiguracyjnego, ponowne wygenerowanie konfiguracji z pamięci podręcznej, a następnie usunięcie rzeczywistych klas fasady i / lub dostawcy usług.
Jason Wheeler
1
W przypadku Laravel 6.6, aby usunąć buforowanie, właśnie usunąłem cachefolder i .envdomyślną wartość pamięci podręcznej w pliku. Ale po usunięciu tego wszystkiego znowu pojawia się problem ... kiedy php artisan optimize. Wreszcie ten rozwiązał mój problem, nie zmieniając nazwy, ale zmieniając wartość klucza w pliku config.php. Dzięki @DeadGuy
Chandan Sharma
49

Jak widzę: http://itsolutionstuff.com/post/laravel-5-clear-cache-from-route-view-config-and-all-cache-data-from-applicationexample.html

czy można użyć poniższego kodu z nowymi poleceniami czyszczenia pamięci podręcznej:

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

Nie jest konieczne, aby umożliwić każdemu wyczyszczenie pamięci podręcznych, szczególnie w środowisku produkcyjnym, więc proponuję skomentować te trasy i, gdy jest to konieczne, usunąć komentarz z kodu i uruchomić trasy.

Francesco
źródło
1
Uważam, że ten fragment jest najbardziej pomocny.
Haseeb Zulfiqar
Mam problem z config: cache nie działa w routerze lub kontrolerze, ale inne działają. jaki byłby problem?
Nayeem
40

Buforowanie konfiguracji Konfiguracja laravel jest rozłożona na dziesiątki plików, a includingkażdy z nich dla każdego żądania jest kosztownym procesem. Aby połączyć wszystkie pliki konfiguracyjne w jeden, użyj:

php artisan config:cache

Pamiętaj, że wszelkie zmiany w konfiguracji nie będą miały żadnego efektu po jej zbuforowaniu. Aby odświeżyć pamięć podręczną konfiguracji, uruchom ponownie powyższe polecenie. Jeśli chcesz całkowicie pozbyć się pamięci podręcznej konfiguracji, uruchom

php artisan config:clear

Buforowanie tras Routing jest kosztownym zadaniem w laravel. Aby buforować plik route.php, uruchom poniższe polecenie:

php artisan route:cache

Pamiętaj, że to nie działa z zamknięciami. Jeśli używasz domknięć, jest to świetna szansa na przeniesienie ich do kontrolera, ponieważ polecenie rzemieślnika zgłosi wyjątek podczas próby kompilowania tras, które są powiązane z domknięciami, zamiast odpowiednich metod kontrolera. Podobnie jak w przypadku pamięci podręcznej konfiguracji, wszelkie zmiany w route.php nie będą już miały żadnego wpływu. Aby odświeżyć pamięć podręczną, uruchom powyższe polecenie za każdym razem, gdy dokonujesz zmiany w pliku tras. Aby całkowicie pozbyć się pamięci podręcznej tras, uruchom poniższe polecenie:

php artisan route:clear

Optymalizacja mapy klas

Często zdarza się, że średniej wielkości projekt jest rozłożony na setki plików PHP. Jak nakazują nam dobre zachowania kodowania, wszystko ma swój własny plik. Nie jest to oczywiście pozbawione wad. Laravel musi zawierać dziesiątki różnych plików dla każdego żądania, co jest kosztowną czynnością.

Dlatego dobrą metodą optymalizacji jest zadeklarowanie, które pliki są używane dla każdego żądania (są to na przykład wszyscy dostawcy usług, oprogramowanie pośredniczące i kilka innych) i połączenie ich w tylko jeden plik, który zostanie następnie załadowany dla każdego żądania. Nie różni się to od łączenia wszystkich plików javascript w jeden, więc przeglądarka będzie musiała wysyłać mniej żądań do serwera.

Dodatkowe pliki kompilacji (ponownie: dostawcy usług, oprogramowanie pośredniczące itd.) Powinny być zadeklarowane przez Ciebie w config / compile.php, w kluczu plików. Gdy umieścisz tam wszystko, co jest niezbędne dla każdego żądania skierowanego do Twojej aplikacji, połącz je w jednym pliku z:

php artisan optimize --force

Optymalizacja automatycznego ładowania kompozytora

Ten jest przeznaczony nie tylko dla laravel, ale dla każdej aplikacji korzystającej z kompozytora.

Najpierw wyjaśnię, jak działa automatyczne ładowanie PSR-4, a następnie pokażę, jakie polecenie należy uruchomić, aby go zoptymalizować. Jeśli nie chcesz wiedzieć, jak działa kompozytor, polecam przeskoczyć bezpośrednio do polecenia konsoli.

Kiedy pytasz kompozytora o App\Controllers\AuthControllerzajęcia, najpierw szuka on bezpośredniego skojarzenia w mapie klasy. Mapa klas to tablica z powiązaniami 1 do 1 klas i plików. Ponieważ, oczywiście, nie dodałeś ręcznie klasy Login i skojarzonego z nią pliku do mapy klas, composer przejdzie dalej i przeszuka przestrzenie nazw. Ponieważ aplikacja jest przestrzenią nazw PSR-4, która jest domyślnie dostarczana z Laravelem i jest powiązana z app/folderem, composer spróbuje przekonwertować nazwę klasy PSR-4 na nazwę pliku z podstawowymi procedurami manipulacji na ciągach. W końcu zgaduje, że App\Controllers\AuthControllermusi znajdować się w pliku AuthController.php, który znajduje się w Controllers/folderze, który na szczęście powinien znajdować się w folderze przestrzeni nazw, którym jestapp/ .

Cała ta ciężka praca polega tylko na tym, aby App\Controllers\AuthControllerklasa istniała w app/Controllers/AuthController.phppliku. Aby kompozytor przeskanował całą aplikację i utworzył bezpośrednie skojarzenia 1 do 1 klas i plików, uruchom następujące polecenie:

composer dumpautoload -o

Pamiętaj, że jeśli już uruchomiłeś php artisan optimize --force, nie musisz już tego uruchamiać. Ponieważ polecenie optymalizacji już nakazuje kompozytorowi utworzenie zoptymalizowanego automatycznego ładowania.

Maulik
źródło
30

Ten pakiet jest przeznaczony dla php ^ 7.0 i ^ laravel5.5 .

Użyj tego pakietu w cronjob, który utworzyłem tylko w tym celu. Ja też miałem taką samą sytuację. https://packagist.org/packages/afrazahmad/clear-cached-data Zainstaluj i uruchom:

php artisan clear:data

i automatycznie uruchomi następujące polecenia

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

Mam nadzieję, że to pomoże.

Jeśli chcesz uruchamiać go automatycznie o określonej godzinie, musisz najpierw skonfigurować crnjob. na przykład

 in app/console/kernel.php

W funkcji harmonogramu:

$schedule->command('clear:data')->dailyAt('07:00');
Afraz Ahmad
źródło
17

Zasadniczo chcę wyczyścić pamięć podręczną widoków.

W Laravel 5.1 jest teraz polecenie do tego

php artisan view:clear
Laurence
źródło
9

Możesz połączyć się przez FTP i wyczyścić storage\framework\viewsfolder dla laravel 5lub app\storage\viewsdla laravel 4.

gandra404
źródło
7

Aby wyczyścić całą pamięć podręczną poza CLI , zrób to; To działa dla mnie.

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

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

   return "Cleared!";

});
Amos Chihi
źródło
config:cachewyczyści i zapisze konfigurację - więc myślę, że nie ma potrzeby dodawania obu
Raja Khoury
pewnie. wystarczy użyć żądanej linii.
Amos Chihi
4
php artisan view:clear

wyczyści buforowane widoki

Spidi
źródło
Pytana jest alternatywa dla polecenia php artisan cache:clear . Nie spowoduje to wyczyszczenia wyświetlanej pamięci podręcznej przechowywanej w folderze przechowywania, co jest dokładnie tym, czego potrzebujemy.
Spidi
2

Możesz to zrobić, jeśli używasz Lumenfrom Laravelw swoim routes/web.phppliku:

use Illuminate\Support\Facades\Artisan;

$app->get('/clear-cache', function () {
    $code = Artisan::call('cache:clear');
    return 'cache cleared';
});
pableiros
źródło
1

Możesz to zrobić również przez router, podobnie jak odpowiedź Francesco, ale z mniejszym bałaganem w konfiguracji routera

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

Następnie uruchom je, odwiedzając http: //myapp.test/artisan/cache-clear itp. Jeśli chcesz dodać / edytować prawidłowe polecenia Artisan, po prostu zaktualizuj tablicę $ validCommands.

chemiczny
źródło
1

To zadziałało dla mnie. W swoim projekcie przejdź do: storage> framework> views. Usuń wszystkie znajdujące się tam pliki i odśwież stronę.

programowo
źródło
1

Użyłem tej strony kilka razy do skopiowania i wklejenia szybkich poleceń do kompozytora, więc napisałem polecenie, które wykonuje te polecenia w jednym poleceniu rzemieślnika.

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

        }
    }
}

Umieść w app\Console\Commands\Adminfolderze

następnie uruchom polecenie w programie Composer php artisan traqza:clear-everything

Miłego kodowania.

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

lzoesch
źródło
0

Chociaż zdecydowanie nie zgadzam się z pomysłem uruchamiania aplikacji laravel na hostingu współdzielonym (ogólnie zły pomysł), ten pakiet prawdopodobnie rozwiązałby twój problem. Jest to pakiet, który umożliwia uruchamianie niektórych poleceń rzemieślniczych z Internetu. Jest daleki od ideału, ale może działać w niektórych przypadkach.

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

Ben Yanke
źródło
0

Uważam, że bardziej wydajnym podejściem jest użycie modułu zadań cron w panelu administracyjnym serwera współdzielonego, aby uruchomić polecenie laravel Scheduler, które z kolei wywoła skonfigurowane polecenie rzemieślnika, coś takiego powinno wykonać zadanie:

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

Dzięki konfiguracji harmonogramu w cronie możesz edytować metodę harmonogramu w \ App \ Console \ Kernel.php, aby wywołać odpowiednie polecenie rzemieślnika, coś takiego:

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

Zawsze możesz usunąć powyższe wiersze po uruchomieniu poleceń

korwalskiy
źródło