Laravel 5 - Vider le cache dans le serveur d'hébergement partagé

125

La question est assez claire.

php artisan cache:clear

Existe-t-il une solution de contournement pour vider le cache comme ci-dessus que nous utilisons dans CLI. J'utilise un service d'hébergement partagé populaire, mais selon mon plan, je n'ai pas accès au panneau de contrôle.

** Je souhaite vider le cache des vues. **

J'ai vu une question presque la même que celle-ci, mais cela ne m'aide pas.

Rinto George
la source
2
Exécuter Laravel sur un hébergement partagé est insensé, IMO, précisément pour ce genre de raison. Comment exécutez-vous les migrations?
ceejayoz
@ceejayoz .. En fait, je viens de commencer ce projet, et c'est aussi mon premier projet laravel. Je ne suis pas encore venu à ce truc de migration ..
Rinto George
11
"Faire fonctionner Laravel sur un hébergement mutualisé est insensé" @ceejayoz ... Mais c'est le monde réel. Parfois, vous devez le faire parce qu'il n'y a pas le choix.
elb98rm
2
@ elb98rm Un VPS de Digital Ocean commence à 5 $ / mois. Il y a toujours un choix, y compris ne pas travailler pour un client qui ne veut pas payer 5 $ / mois pour l'hébergement.
ceejayoz
19
@ceejayoz Pas pertinent - j'ai souvent travaillé pour des endroits où ce n'est pas l'argent, c'est la relation ou l'hôte et la politique interne. De plus - parfois, cela ne dépend littéralement pas de l'ensemble de votre département. Le monde réel signifie que vous devez parfois travailler avec une situation. Vous êtes chanceux ou à l'abri si vous n'avez jamais eu à travailler avec les choix d'une autre personne ...
elb98rm

Réponses:

146

Vous pouvez appeler une commande Artisan en dehors de la CLI.

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

Vous pouvez consulter la documentation officielle ici http://laravel.com/docs/5.0/artisan#calling-commands-outside-of-cli


Mettre à jour

Il n'existe aucun moyen de supprimer le cache de vue. Ni le php artisan cache:clearfait que.

Si vous voulez vraiment effacer le cache de vue, je pense que vous devez écrire votre propre artisancommande et l'appeler comme je l'ai déjà dit, ou ignorer complètement le artisanchemin et effacer le cache de vue dans une classe que vous appelez depuis un contrôleur ou une route.

Mais ma vraie question est de savoir si vous avez vraiment besoin de vider le cache de vue ? Dans un projet sur lequel je travaille actuellement, j'ai presque 100 vues en cache et elles pèsent moins de 1 Mo, alors que mon vendorrépertoire est> 40 Mo. Je ne pense pas que le cache de vue soit un véritable goulot d'étranglement dans l'utilisation du disque et que je n'ai jamais eu vraiment besoin de l'effacer.

Quant au cache de l' application , il est stocké dans le storage/framework/cacherépertoire, mais uniquement si vous avez configuré le filepilote dans config/cache.php. Vous pouvez choisir de nombreux pilotes différents, tels que Redis ou Memcached , pour améliorer les performances sur un cache basé sur des fichiers.

Marco Pallante
la source
1
Quel cache essayez-vous de vider? La cache:clearcommande fonctionne avec le cache de l' application , celui auquel on accède depuis la Cachefaçade.
Marco Pallante
Je veux effacer le cache de vue, il y a beaucoup de pages enregistrées dans le dossier de cache de vue. Une dernière question, quand dit cache d'application, quels sont tous les répertoires qu'il cible.
Rinto George
Merci pour l'explication!. Je ne suis pas préoccupé par l'espace disque :) Mais une question si le cache de la vue ne s'efface pas, alors comment les nouveaux changements de vue sont-ils affectés dans le site Web, est-ce qu'une vérification d'E / S se produit dans laravel?
Rinto George
1
Je pense qu'il vérifie l'horodatage des fichiers, ce qui est plus rapide que la reconstruction du modèle de lame
Marco Pallante
Oui, je suppose, de toute façon vous m'avez aidé à penser de la bonne manière, merci!
Rinto George
61

J'espère que ça aidera quelqu'un

Allez laravelFolder/bootstrap/cachepuis renommez-le config.phpen tout ce que vous voulez, par exemple. config.php_oldet rechargez votre site. Cela devrait fonctionner comme du vaudou.

Codage heureux ...

Le mec mort
la source
Je confirme. Fonctionne dans laravel 5.4. Moi, je salue.
simon
1
La seule et unique solution! Si vous vous demandez pourquoi ça marche? seul Dieu sait
Luis Contreras
Confirmé qu'il efface la douleur dans le a ** tout en hébergeant laravel 5.4 de Windows à l'hébergement mutualisé .... MERCI !!!
Rikudo Pain
Il semble que dans quelques scénarios, c'est la seule solution qui fonctionne. Si vous avez une configuration mise en cache et que vous supprimez une façade ou un fournisseur de services, lorsque vous exécutez la commande pour créer la nouvelle configuration mise en cache, elle s'exécute en utilisant la configuration mise en cache existante et essaie de référencer les classes de façade et / ou de fournisseur de services qui n'existe plus et échoue. L'autre option serait de supprimer les références du fichier de configuration, de régénérer votre configuration mise en cache, puis de supprimer les classes de façade et / ou de fournisseur de services.
Jason Wheeler
1
Pour Laravel 6.6, pour supprimer la mise en cache, je viens de supprimer le cachedossier et .envla valeur de cache par défaut du fichier. Mais après avoir supprimé tout ce problème à nouveau .. quand php artisan optimize. Enfin, celui-ci a résolu mon problème, non pas en renommant mais en modifiant la valeur de clé dans le fichier config.php. Merci @DeadGuy
Chandan Sharma
49

Comme je peux le voir: http://itsolutionstuff.com/post/laravel-5-clear-cache-from-route-view-config-and-all-cache-data-from-applicationexample.html

est-il possible d'utiliser le code ci-dessous avec les nouvelles commandes d'effacement du 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>';
});

Il n'est pas nécessaire de donner la possibilité de vider les caches à tout le monde, en particulier dans un environnement de production, je suggère donc de commenter ces routes et, si nécessaire, de dé-commenter le code et d'exécuter les routes.

Francesco
la source
1
J'ai trouvé cet extrait de code très utile.
Haseeb Zulfiqar
J'ai un problème avec la configuration: le cache ne fonctionne pas dans la route ou le contrôleur, mais d'autres fonctionnent. quel serait le problème?
Nayeem le
40

Mise en cache de la configuration La configuration de laravel s'étend sur des dizaines de fichiers, et includingchacun d'entre eux pour chaque requête est un processus coûteux. Pour combiner tous vos fichiers de configuration en un seul, utilisez:

php artisan config:cache

Gardez à l'esprit que toute modification apportée à la configuration n'aura aucun effet une fois que vous l'aurez mise en cache. Pour actualiser le cache de configuration, exécutez à nouveau la commande ci-dessus. Si vous souhaitez vous débarrasser complètement du cache de configuration, exécutez

php artisan config:clear

Mise en cache des routes Le routage est également une tâche coûteuse dans laravel. Pour mettre en cache le fichier routes.php, exécutez la commande ci-dessous:

php artisan route:cache

Notez que cela ne fonctionne pas avec les fermetures. Si vous utilisez des fermetures, c'est une excellente chance de les déplacer dans un contrôleur, car la commande artisan lèvera une exception en essayant de compiler des routes liées à des fermetures au lieu de méthodes de contrôleur appropriées. De la même manière que le cache de configuration, toute modification apportée à routes.php n'aura plus aucun effet. Pour actualiser le cache, exécutez la commande ci-dessus à chaque fois que vous modifiez le fichier de routes. Pour vous débarrasser complètement du cache d'itinéraire, exécutez la commande ci-dessous:

php artisan route:clear

Optimisation de la carte de classe

Il n'est pas rare qu'un projet de taille moyenne soit réparti sur des centaines de fichiers PHP. Comme nous le dictent les bons comportements de codage, tout a son propre fichier. Ceci, bien entendu, n'est pas sans inconvénients. Laravel doit inclure des dizaines de fichiers différents pour chaque requête, ce qui est une opération coûteuse.

Par conséquent, une bonne méthode d'optimisation consiste à déclarer quels fichiers sont utilisés pour chaque requête (il s'agit, par exemple, de tous vos fournisseurs de services, middlewares et quelques autres) et de les combiner dans un seul fichier, qui sera ensuite chargé pour chaque requête. Ce n'est pas différent de combiner tous vos fichiers javascript en un seul, de sorte que le navigateur devra faire moins de requêtes au serveur.

Les fichiers de compilation supplémentaires (encore une fois: fournisseurs de services, middlewares, etc.) doivent être déclarés par vous dans config / compile.php, dans la clé files. Une fois que vous y avez mis tout ce qui est essentiel pour chaque demande faite à votre application, concaténez-les dans un seul fichier avec:

php artisan optimize --force

Optimisation du chargement automatique du composeur

Celui-ci n'est pas seulement pour laravel, mais pour toute application utilisant composer.

Je vais d'abord expliquer comment fonctionne le chargement automatique du PSR-4, puis je vous montrerai quelle commande vous devez exécuter pour l'optimiser. Si vous n'êtes pas intéressé par le fonctionnement de composer, je vous recommande de passer directement à la commande console.

Lorsque vous demandez à composer la App\Controllers\AuthControllerclasse, il recherche d'abord une association directe dans le classmap. Le classmap est un tableau avec des associations 1 à 1 de classes et de fichiers. Puisque, bien sûr, vous n'avez pas ajouté manuellement la classe Login et son fichier associé au classmap, composer continuera et recherchera dans les espaces de noms. Étant donné que App est un espace de noms PSR-4, fourni par défaut avec Laravel et associé au app/dossier, composer essaiera de convertir le nom de la classe PSR-4 en nom de fichier avec des procédures de manipulation de chaîne de base. En fin de compte, il suppose que cela App\Controllers\AuthControllerdoit être situé dans un fichier AuthController.php, qui se trouve dans un Controllers/dossier qui devrait heureusement se trouver dans le dossier de l'espace de noms, qui est app/.

Tout ce travail acharné uniquement pour obtenir que la App\Controllers\AuthControllerclasse existe dans le app/Controllers/AuthController.phpfichier. Pour que le compositeur analyse l'intégralité de votre application et crée des associations directes 1 à 1 de classes et de fichiers, exécutez la commande suivante:

composer dumpautoload -o

Gardez à l'esprit que si vous avez déjà exécuté php artisan Optimize --force, vous n'avez plus besoin d'exécuter celui-ci. Étant donné que la commande d'optimisation indique déjà au compositeur de créer un chargement automatique optimisé.

Maulik
la source
30

Ce paquet est pour php ^ 7.0 et ^ laravel5.5 .

Utilisez ce package dans cronjob que j'ai créé à cet effet uniquement. J'étais également confronté à la même situation. https://packagist.org/packages/afrazahmad/clear-cached-data Installez-le et exécutez:

php artisan clear:data

et il exécutera les commandes suivantes automatiquement

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

J'espère que ça aide.

Si vous voulez l'exécuter automatiquement à un moment précis, vous devrez d'abord configurer crnjob. par exemple

 in app/console/kernel.php

En fonction de planification:

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

Fondamentalement, je veux effacer le cache des vues.

Il y a maintenant une commande dans Laravel 5.1 pour cela

php artisan view:clear
Laurence
la source
9

Vous pouvez vous connecter via FTP et effacer le storage\framework\viewsdossier pour laravel 5ou app\storage\viewspour laravel 4.

gandra404
la source
7

Pour effacer tout le cache en dehors de la CLI , procédez comme suit ; Cela fonctionne pour moi.

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

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

   return "Cleared!";

});
Amos Chihi
la source
config:cacheva effacer et mettre en cache la configuration - donc je suppose qu'il n'est pas nécessaire d'ajouter les deux
Raja Khoury
sûr. vous utilisez simplement la ligne dont vous avez besoin.
Amos Chihi
4
php artisan view:clear

effacera les vues mises en cache

Spidi
la source
L'alternative à la commande php artisan cache:clear est demandée. Cela n'effacera pas le cache affiché stocké dans le dossier de stockage, ce qui est exactement ce dont vous avez besoin.
Spidi
2

Vous pouvez le faire si vous utilisez Lumenfrom Laravelsur votre routes/web.phpfichier:

use Illuminate\Support\Facades\Artisan;

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

Vous pouvez également le faire via un routeur, similaire à la réponse Francesco mais avec moins d'encombrement dans la configuration du routeur

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

Ensuite, exécutez-les via http: //myapp.test/artisan/cache-clear etc Si vous avez besoin d'ajouter / modifier des commandes Artisan valides, mettez simplement à jour le tableau $ validCommands.

chimie
la source
1

Cela a fonctionné pour moi. Dans votre projet, accédez à: stockage> cadre> vues. Supprimez tous les fichiers et actualisez votre page.

programmatique
la source
1

J'ai utilisé cette page à quelques reprises pour copier et coller des commandes rapides dans composer, j'ai donc écrit une commande qui exécute ces commandes en une seule commande artisanale.

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

        }
    }
}

Placer dans le app\Console\Commands\Admindossier

puis exécutez la commande dans composer php artisan traqza:clear-everything

Bon codage.

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

Lzoesch
la source
0

Bien que je ne sois pas du tout d'accord avec l'idée d'exécuter une application laravel sur un hébergement partagé (une mauvaise idée tout autour), ce package résoudrait probablement votre problème. C'est un package qui vous permet d'exécuter des commandes artisanales à partir du Web. C'est loin d'être parfait, mais peut fonctionner pour certains cas d'utilisation.

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

Ben Yanke
la source
0

Je pense que l'approche la plus efficace consiste à utiliser le module de travail cron dans le panneau d'administration du serveur partagé pour exécuter la commande laravel scheduler qui appellera à son tour la commande artisan configurée, quelque chose comme celui-ci devrait faire le travail:

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

Avec la configuration du planificateur dans cron, vous pouvez modifier la méthode de planification dans \ App \ Console \ Kernel.php pour appeler la bonne commande artisan, quelque chose comme ceci:

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

Vous pouvez toujours supprimer les lignes ci-dessus après l'exécution des commandes

korwalskiy
la source