Laravel 5 - Limpar cache no servidor de hospedagem compartilhada

125

A questão é bem clara.

php artisan cache:clear

Existe alguma solução alternativa para limpar o cache como acima, usando na CLI. Estou usando um serviço de hospedagem compartilhada popular, mas de acordo com meu plano, não tenho acesso ao painel de controle.

** Quero limpar o cache de visualizações. **

Eu vi uma pergunta quase igual a essa, mas isso não me ajuda.

Rinto George
fonte
2
Executar o Laravel em hospedagem compartilhada é uma loucura, IMO, exatamente por esse tipo de razão. Como você está executando migrações?
ceejayoz
@ceejayoz .. Na verdade, eu apenas comecei este projeto, e é o meu primeiro projeto de laravel também. Eu ainda não vim para essa coisa de migração ..
Rinto George
11
"Executar o Laravel em hospedagem compartilhada é insano" @ceejayoz ... Mas este é o mundo real. Às vezes você precisa, porque não há escolha.
Elb98rm 01/09/19
2
@ elb98rm Um VPS da Digital Ocean começa em US $ 5 / mês. Sempre há uma opção, inclusive não trabalhar para um cliente que não está disposto a pagar US $ 5 / mês pela hospedagem.
ceejayoz
19
@ceejayoz Não relevante - muitas vezes eu trabalhei em lugares onde não é dinheiro, relacionamento ou host e política interna. Além disso - às vezes, literalmente, não cabe a todo o departamento. O mundo real significa que às vezes você precisa trabalhar com uma situação. Você tem sorte ou abrigada se você nunca teve que trabalhar com as escolhas de outra pessoa ...
elb98rm

Respostas:

146

Você pode chamar um comando Artisan fora da CLI.

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

Você pode verificar o documento oficial aqui http://laravel.com/docs/5.0/artisan#calling-commands-outside-of-cli


Atualizar

Não há como excluir o cache da visualização. Nem php artisan cache:clearisso.

Se você realmente deseja limpar o cache de visualização, acho que você deve escrever seu próprio artisancomando e chamá-lo como eu disse antes, ou pular completamente o artisancaminho e limpar o cache de visualização em alguma classe que você chama de um controlador ou rota.

Mas, minha verdadeira pergunta é: você realmente precisa limpar o cache da visualização ? Em um projeto em que estou trabalhando agora, tenho quase 100 visualizações em cache e elas pesam menos de 1 Mb, enquanto meu vendordiretório é> 40 Mb. Não acho que o cache de exibição seja um gargalo real no uso do disco e nunca houve uma necessidade real de limpá-lo.

Quanto ao cache do aplicativo , ele é armazenado no storage/framework/cachediretório, mas somente se você configurou o filedriver config/cache.php. Você pode escolher muitos drivers diferentes, como Redis ou Memcached , para melhorar o desempenho em um cache baseado em arquivo.

Marco Pallante
fonte
1
Qual cache você está tentando limpar? O cache:clearcomando funciona com o cache do aplicativo , aquele acessado a partir da Cachefachada.
Marco Pallante 16/07/2015
Eu quero limpar o cache de exibição, há muitas páginas salvas na pasta de cache de exibição. Mais uma pergunta, quando diz cache de aplicativos, que são todos os diretórios para os quais ele se destina.
Rinto George
Obrigada pelo esclarecimento!. Não estou preocupado com o espaço em disco :) Mas uma pergunta, se o cache de exibição não está sendo limpo, como as novas alterações de exibição são afetadas no site, é que alguma verificação de E / S está acontecendo no laravel?
Rinto George
1
Eu acho que ele faz um timestamp a verificação de arquivos, que é mais rápido do que reconstruir o modelo de lâmina
Marco Pallante
Sim, acho que sim, de qualquer maneira você me ajudou a pensar da maneira certa, obrigado!
Rinto George
61

Espero que isso ajude alguém

Vá para laravelFolder/bootstrap/cacherenomear config.phppara o que quiser, por exemplo. config.php_olde recarregue seu site. Isso deve funcionar como vodu.

Feliz codificação ...

The Dead Guy
fonte
Eu confirmo. Trabalhos em laravel 5.4. Eu me curvo.
simon
1
A única solução! Se você quer saber por que funciona? Só Deus sabe
Luis Contreras
Confirmado que limpe a dor no a ** enquanto hospeda o laravel 5.4 do windows para hospedagem compartilhada .... OBRIGADO !!!
Rikudo Pain
Parece que, em alguns cenários, esta é a única solução que funciona. Se você tiver uma configuração em cache e remover uma Fachada ou Provedor de Serviços, ao executar o comando para criar a nova configuração em cache, ela será executada usando a configuração em cache existente e tentará fazer referência às classes Fachada e / ou Provedor de Serviços que não existe mais e falha. A outra opção seria remover as referências do arquivo de configuração, regenerar sua configuração em cache e remover as classes Fachada e / ou Provedor de Serviços reais.
21817 Jason Wheeler
1
Para o Laravel 6.6, para remover o cache, eu apenas removi a cachepasta e .envo valor padrão do cache do arquivo. Mas depois de excluir tudo isso ficando problema novamente .. quando php artisan optimize. Finalmente, este resolveu meu problema, não renomeando, mas alterando o valor da chave no arquivo config.php. Obrigado @DeadGuy
Chandan Sharma
49

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

é possível usar o código abaixo com os novos comandos de limpeza de 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>';
});

Não é necessário dar a possibilidade de limpar os caches para todos, especialmente em um ambiente de produção, por isso sugiro comentar essas rotas e, quando necessário, descomentar o código e executar as rotas.

Francesco
fonte
1
Eu achei este trecho mais útil.
Haseeb Zulfiqar #
Eu tenho problema com a configuração: o cache não funciona na rota ou no controlador, mas outros são trabalhados. qual seria o problema?
Nayeem 6/02
40

Cache de configuração A configuração do laravel se espalha por dezenas de arquivos, e includingcada um deles para cada solicitação é um processo caro. Para combinar todos os seus arquivos de configuração em um, use:

php artisan config:cache

Lembre-se de que quaisquer alterações na configuração não terão efeito depois que você a armazenar em cache. Para atualizar o cache de configuração, execute o comando acima novamente. Caso você queira se livrar completamente do cache de configuração, execute

php artisan config:clear

Cache de rotas O roteamento também é uma tarefa cara no laravel. Para armazenar em cache o arquivo routes.php, execute o comando abaixo:

php artisan route:cache

Lembre-se de que não funciona com fechamentos. Caso você esteja usando closures, é uma ótima chance de movê-los para um controlador, pois o comando artisan lançará uma exceção ao tentar compilar rotas que estão vinculadas a closures em vez de métodos apropriados de controller. Da mesma forma que o cache de configuração, quaisquer alterações no routes.php não terão mais efeito. Para atualizar o cache, execute o comando acima sempre que fizer uma alteração no arquivo de rotas. Para se livrar completamente do cache da rota, execute o comando abaixo:

php artisan route:clear

Otimização de Classmap

Não é incomum que um projeto de tamanho médio se espalhe por centenas de arquivos PHP. Como bons comportamentos de codificação nos ditam, tudo tem seu próprio arquivo. Obviamente, isso não vem sem inconvenientes. O Laravel precisa incluir dezenas de arquivos diferentes para cada solicitação, o que é uma coisa cara a se fazer.

Portanto, um bom método de otimização é declarar quais arquivos são usados ​​para cada solicitação (isto é, por exemplo, todos os seus provedores de serviços, middlewares e mais alguns) e combiná-los em apenas um arquivo, que será carregado posteriormente para cada solicitação. Isso não é diferente de combinar todos os seus arquivos javascript em um, portanto, o navegador precisará fazer menos solicitações ao servidor.

Os arquivos de compilação adicionais (novamente: provedores de serviços, middlewares e assim por diante) devem ser declarados por você em config / compile.php, na chave de arquivos. Depois de colocar lá tudo o essencial para cada solicitação feita ao seu aplicativo, concatene-os em um arquivo com:

php artisan optimize --force

Otimizando o carregamento automático do compositor

Este não é apenas para o laravel, mas para qualquer aplicativo que esteja usando o compositor.

Vou explicar primeiro como o PSR-4 carrega automaticamente, e depois mostrarei qual comando você deve executar para otimizá-lo. Se você não estiver interessado em saber como o compositor funciona, eu recomendo que você pule diretamente para o comando do console.

Quando você pergunta à compositora sobre a App\Controllers\AuthControllerturma, ela primeiro procura uma associação direta no mapa de turmas. O mapa de classe é uma matriz com associações 1 a 1 de classes e arquivos. Como, obviamente, você não adicionou manualmente a classe Login e seu arquivo associado ao mapa de classes, o compositor seguirá em frente e pesquisará nos espaços para nome. Como o App é um espaço de nome PSR-4, que vem por padrão com o Laravel e está associado à app/pasta, o compositor tentará converter o nome da classe PSR-4 em um nome de arquivo com procedimentos básicos de manipulação de string. No final, ele acha que App\Controllers\AuthControllerdeve estar localizado em um arquivo AuthController.php, que está em uma Controllers/pasta que deve estar felizmente na pasta de namespace, que está app/.

Todo esse trabalho duro apenas para obter que a App\Controllers\AuthControllerclasse exista no app/Controllers/AuthController.phparquivo. Para que o compositor verifique todo o aplicativo e crie associações diretas 1 a 1 de classes e arquivos, execute o seguinte comando:

composer dumpautoload -o

Lembre-se de que se você já executou o php artisan optimize --force, não precisará mais executar este. Como o comando otimizar já diz ao compositor para criar um carregamento automático otimizado.

Maulik
fonte
30

Este pacote é para php ^ 7.0 e ^ laravel5.5 .

Use este pacote no cronjob que eu criei apenas para esse fim. Eu também estava enfrentando a mesma situação. https://packagist.org/packages/afrazahmad/clear-cached-data Instale e execute:

php artisan clear:data

e ele executará os seguintes comandos automaticamente

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

Espero que ajude.

Se você deseja executá-lo automaticamente em um horário específico, precisará primeiro configurar o crnjob. por exemplo

 in app/console/kernel.php

Na função de programação:

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

Basicamente, quero limpar o cache de visualizações.

Agora existe um comando no Laravel 5.1 para esse

php artisan view:clear
Laurence
fonte
9

Você pode se conectar via FTP e limpar a storage\framework\viewspasta para laravel 5ou app\storage\viewspara laravel 4.

gandra404
fonte
7

Para limpar todo o cache fora da CLI , faça isso; Isso funciona para mim.

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

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

   return "Cleared!";

});
Amos Chihi
fonte
config:cacheirá limpar e configuração de cache - então eu acho que não há necessidade de adicionar tanto
Raja Khoury
certo. você apenas usa a linha que precisa.
Amos Chihi
4
php artisan view:clear

limpará as visualizações em cache

Spidi
fonte
A alternativa ao comando php artisan cache:clear é solicitada. Isso não limpa o cache visualizado armazenado na pasta de armazenamento, exatamente o que é necessário.
Spidi #
2

Você pode fazer isso se você estiver usando Lumena partir Laraveldo seu routes/web.phparquivo:

use Illuminate\Support\Facades\Artisan;

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

Você também pode fazer isso via roteador, semelhante à resposta de Francesco, mas com menos confusão na configuração do roteador

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

Em seguida, execute-os acessando http: //myapp.test/artisan/cache-clear etc. Se você precisar adicionar / editar comandos válidos do Artisan, atualize a matriz $ validCommands.

químico
fonte
1

Isso funcionou para mim. No seu projeto, acesse: storage> framework> views. Exclua todos os arquivos e atualize sua página.

rogramático
fonte
1

Usei esta página algumas vezes para copiar e colar comandos rápidos no compositor, então escrevi um comando que executa esses comandos em um único comando artesanal.

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

        }
    }
}

Coloque na app\Console\Commands\Adminpasta

em seguida, execute o comando no compositor php artisan traqza:clear-everything

Feliz codificação.

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

lzoesch
fonte
0

Embora eu discorde totalmente da idéia de executar um aplicativo laravel em hospedagem compartilhada (uma má idéia ao redor), este pacote provavelmente resolveria o seu problema. É um pacote que permite executar alguns comandos artesanais da web. Está longe de ser perfeito, mas pode funcionar para alguns casos de uso.

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

Ben Yanke
fonte
0

Acredito que a abordagem mais eficiente para isso é usar o módulo cron job no painel de administração do servidor compartilhado para executar o comando laravel scheduler, que por sua vez chamará o comando artesão configurado, algo como isto deve fazer o trabalho:

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

Com a configuração do agendador no cron, você pode editar o método de agendamento em \ App \ Console \ Kernel.php para chamar o comando artesão correto, algo como isto:

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

Você sempre pode excluir as linhas acima após a execução dos comandos

korwalskiy
fonte