Laravel 5 - Borrar caché en servidor de alojamiento compartido

125

La pregunta es bastante clara.

php artisan cache:clear

¿Hay alguna solución para borrar el caché como el que usamos anteriormente en la CLI? Estoy usando un popular servicio de alojamiento compartido, pero según mi plan, no tengo acceso al panel de control.

** Quiero borrar el caché de vistas. **

Vi una pregunta casi igual que esta, pero no me ayuda.

Rinto George
fuente
2
Ejecutar Laravel en hosting compartido es una locura, IMO, precisamente por este tipo de razón. ¿Cómo estás ejecutando las migraciones?
ceejayoz
@ceejayoz .. En realidad, acabo de comenzar este proyecto, y también es mi primer proyecto laravel. No vine a esta cosa de la migración todavía ...
Rinto George
11
"Ejecutar Laravel en hosting compartido es una locura" @ceejayoz ... Pero este es el mundo real. A veces tienes que hacerlo porque no hay otra opción.
elb98rm
2
@ elb98rm Un VPS de Digital Ocean comienza en $ 5 / mes. Siempre hay una opción, que incluye no trabajar para un cliente que no está dispuesto a pagar $ 5 / mes por el alojamiento.
ceejayoz
19
@ceejayoz No relevante: a menudo he trabajado para lugares donde no es el dinero, es la relación o el anfitrión y la política interna. Además, a veces literalmente no depende de todo su departamento. El mundo real significa que a veces necesitas trabajar con una situación. Eres afortunado o protegido si nunca has tenido que trabajar con las elecciones de otra persona ...
elb98rm

Respuestas:

146

Puede llamar a un comando Artisan fuera de la CLI.

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

Puede consultar el documento oficial aquí http://laravel.com/docs/5.0/artisan#calling-commands-outside-of-cli


Actualizar

No hay forma de eliminar la vista de caché. Tampoco php artisan cache:cleareso.

Si realmente desea borrar el caché de vista, creo que debe escribir su propio artisancomando y llamarlo como dije antes, o omitir por completo la artisanruta y borrar el caché de vista en alguna clase que llame desde un controlador o una ruta.

Pero, mi verdadera pregunta es , ¿realmente necesita borrar el caché de la vista ? En un proyecto en el que estoy trabajando ahora, tengo casi 100 vistas en caché y pesan menos de 1 Mb, mientras que mi vendordirectorio es> 40 Mb. No creo que ver el caché sea un verdadero cuello de botella en el uso del disco y nunca tuve una necesidad real de borrarlo.

En cuanto a la caché de la aplicación , se almacena en el storage/framework/cachedirectorio, pero solo si configuró el filecontrolador config/cache.php. Puede elegir muchos controladores diferentes, como Redis o Memcached , para mejorar el rendimiento en una memoria caché basada en archivos.

Marco Pallante
fuente
1
¿Qué caché estás tratando de borrar? El cache:clearcomando funciona con el caché de la aplicación , al que se accede desde la Cachefachada.
Marco Pallante
Quiero borrar la vista de caché, hay muchas páginas guardadas en la carpeta de vista de caché. Una pregunta más, cuando dice caché de aplicaciones, que son todos los directorios a los que se dirige.
Rinto George
¡Gracias por la explicación!. No estoy preocupado por el espacio en los discos :) Pero una pregunta si la memoria caché de la vista no se está borrando, entonces, ¿cómo se verán afectados los nuevos cambios en la vista en el sitio web? ¿Hay alguna verificación de E / S en laravel?
Rinto George
1
Creo que hace una comprobación de marca de tiempo en los archivos, que es más rápido que reconstruir la plantilla de la hoja
Marco Pallante
Sí, supongo que sí, de todos modos me ayudaste a pensar de la manera correcta, ¡gracias!
Rinto George
61

Espero que esto ayude a alguien

Vaya a laravelFolder/bootstrap/cachecambiar el nombre config.phpa cualquier cosa que desee, por ejemplo. config.php_oldy recarga tu sitio. Eso debería funcionar como vudú.

Feliz codificación ...

El hombre muerto
fuente
Confirmo. Obras en laravel 5.4. Yo me inclino.
Simon
1
¡La única solución! Si te preguntas por qué funciona? solo dios sabe
Luis Contreras
Confirmó que borró el dolor en el a ** mientras hospedaba laravel 5.4 desde Windows al alojamiento compartido ... ¡GRACIAS!
Rikudo Pain
Parece que en algunos escenarios, esta es la única solución que funciona. Si tiene una configuración en caché y luego elimina una Fachada o un Proveedor de servicios, cuando ejecuta el comando para crear la nueva configuración en caché, se ejecuta utilizando la configuración en caché existente e intenta hacer referencia a las clases de Fachada y / o Proveedor de servicios que ya no existe y falla. La otra opción sería eliminar las referencias del archivo de configuración, volver a generar la configuración almacenada en caché y luego eliminar las clases reales de Fachada y / o Proveedor de servicios.
Jason Wheeler
1
Para Laravel 6.6, para eliminar el almacenamiento en caché, acabo de eliminar la cachecarpeta y .envel valor de caché predeterminado del archivo. Pero después de eliminar todo este problema de nuevo ... cuando php artisan optimize. Finalmente, este resolvió mi problema, no cambiando el nombre sino cambiando el valor clave en el archivo config.php. Gracias @DeadGuy
Chandan Sharma
49

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

¿Es posible utilizar el siguiente código con los nuevos comandos clear 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>';
});

No es necesario dar la posibilidad de borrar los cachés a todos, especialmente en un entorno de producción, por lo que sugiero comentar esas rutas y, cuando sea necesario, descomentar el código y ejecutar las rutas.

Francesco
fuente
1
Encontré este fragmento más útil.
Haseeb Zulfiqar
Tengo un problema con la configuración: el caché no funciona en la ruta o el controlador, pero otros funcionan. cual seria el problema
Nayeem
40

Caché de configuración La configuración de laravel se propaga a través de docenas de archivos, y includingcada uno de ellos para cada solicitud es un proceso costoso. Para combinar todos sus archivos de configuración en uno, use:

php artisan config:cache

Tenga en cuenta que cualquier cambio en la configuración no tendrá ningún efecto una vez que lo guarde en caché. Para actualizar la caché de configuración, ejecute el comando anterior nuevamente. En caso de que desee deshacerse por completo de la caché de configuración, ejecute

php artisan config:clear

Rutas de almacenamiento en caché El enrutamiento también es una tarea costosa en laravel. Para almacenar en caché el archivo routes.php, ejecute el siguiente comando:

php artisan route:cache

Tenga en cuenta que no funciona con cierres. En caso de que esté usando cierres, esta es una gran oportunidad para moverlos a un controlador, ya que el comando artesanal arrojará una excepción al intentar compilar rutas que están vinculadas a cierres en lugar de los métodos de controlador adecuados. Al igual que la caché de configuración, cualquier cambio en routes.php ya no tendrá ningún efecto. Para actualizar el caché, ejecute el comando anterior cada vez que realice un cambio en el archivo de rutas. Para deshacerse por completo de la caché de ruta, ejecute el siguiente comando:

php artisan route:clear

Optimización de mapa de clase

No es raro que un proyecto de tamaño mediano se extienda a través de cientos de archivos PHP. Como los buenos comportamientos de codificación nos dictan, todo tiene su propio archivo. Esto, por supuesto, no viene sin inconvenientes. Laravel tiene que incluir docenas de archivos diferentes para cada solicitud, lo cual es algo costoso de hacer.

Por lo tanto, un buen método de optimización es declarar qué archivos se utilizan para cada solicitud (esto es, por ejemplo, todos sus proveedores de servicios, middlewares y algunos más) y combinarlos en un solo archivo, que luego se cargará para cada solicitud. Esto no es diferente de combinar todos sus archivos javascript en uno, por lo que el navegador tendrá que hacer menos solicitudes al servidor.

Usted debe declarar los archivos de compilación adicionales (nuevamente: proveedores de servicios, middlewares, etc.) en config / compile.php, en la clave de archivos. Una vez que haya puesto allí todo lo esencial para cada solicitud realizada en su aplicación, concatenelas en un archivo con:

php artisan optimize --force

Optimizando la carga automática del compositor

Este no es solo para laravel, sino para cualquier aplicación que haga uso del compositor.

Primero explicaré cómo funciona la carga automática de PSR-4, y luego le mostraré qué comando debe ejecutar para optimizarlo. Si no está interesado en saber cómo funciona el compositor, le recomiendo que salte directamente al comando de la consola.

Cuando le pregunta al compositor por la App\Controllers\AuthControllerclase, primero busca una asociación directa en el mapa de clase. El mapa de clase es una matriz con asociaciones 1 a 1 de clases y archivos. Como, por supuesto, no agregó manualmente la clase de inicio de sesión y su archivo asociado al mapa de clase, el compositor continuará y buscará en los espacios de nombres. Debido a que la aplicación es un espacio de nombres PSR-4, que viene por defecto con Laravel y está asociada a la app/carpeta, el compositor intentará convertir el nombre de la clase PSR-4 en un nombre de archivo con procedimientos básicos de manipulación de cadenas. Al final, adivina que App\Controllers\AuthControllerdebe ubicarse en un archivo AuthController.php, que está en una Controllers/carpeta que afortunadamente debería estar en la carpeta del espacio de nombres, que está app/.

Todo este trabajo duro solo para lograr que la App\Controllers\AuthControllerclase exista en el app/Controllers/AuthController.phparchivo. Para que el compositor escanee toda su aplicación y cree asociaciones directas 1 a 1 de clases y archivos, ejecute el siguiente comando:

composer dumpautoload -o

Tenga en cuenta que si ya ejecutó php artisan optimice --force, ya no tendrá que ejecutar este. Dado que el comando de optimización ya le dice al compositor que cree una carga automática optimizada.

Maulik
fuente
30

Este paquete es para php ^ 7.0 y ^ laravel5.5 .

Use este paquete en cronjob que he creado solo para este propósito. También me enfrentaba a la misma situación. https://packagist.org/packages/afrazahmad/clear-cached-data Instalarlo y ejecutar:

php artisan clear:data

y ejecutará los siguientes comandos automáticamente

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

Espero eso ayude.

Si desea ejecutarlo automáticamente a una hora específica, primero deberá configurar el trabajo crnjob. p.ej

 in app/console/kernel.php

En función del horario:

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

Básicamente quiero borrar el caché de vistas.

Ahora hay un comando en Laravel 5.1 para eso

php artisan view:clear
Laurence
fuente
9

Puede conectarse a través de FTP y borrar la storage\framework\viewscarpeta para laravel 5o app\storage\viewspara laravel 4.

gandra404
fuente
7

Para borrar todo el caché fuera de la CLI , haga esto; Esto funciona para mi.

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

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

   return "Cleared!";

});
Amos Chihi
fuente
config:cachecompensará y configuración de caché - así que supongo que no hay necesidad de añadir tanto
Raja Khoury
Por supuesto. solo usa la línea que necesita.
Amos Chihi
4
php artisan view:clear

borrará las vistas en caché

Spidi
fuente
Se php artisan cache:clear pide la alternativa al comando . Esto no borrará la memoria caché visualizada almacenada en la carpeta de almacenamiento, que es exactamente lo que se necesita.
Spidi
2

Puede hacer esto si está utilizando Lumendesde Laravelsu routes/web.phparchivo:

use Illuminate\Support\Facades\Artisan;

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

También puede hacerlo a través del enrutador, similar a la respuesta de Francesco pero con menos desorden en la configuración del enrutador

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

Luego ejecútelos visitando http: //myapp.test/artisan/cache-clear, etc. Si necesita agregar / editar comandos Artisan válidos, simplemente actualice la matriz $ validCommands.

quimico
fuente
1

Esto funcionó para mí. En su proyecto, vaya a: almacenamiento> marco> vistas. Elimine todos los archivos allí y actualice su página.

rogramatic
fuente
1

Usé esta página varias veces para copiar y pegar comandos rápidos en el compositor, así que escribí un comando que ejecuta estos comandos en un solo 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 . '');

        }
    }
}

Colocar en app\Console\Commands\Admincarpeta

luego ejecuta el comando en el compositor php artisan traqza:clear-everything

Feliz codificación

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

lzoesch
fuente
0

Si bien estoy totalmente en desacuerdo con la idea de ejecutar una aplicación laravel en alojamiento compartido (una mala idea en general), este paquete probablemente resolverá su problema. Es un paquete que le permite ejecutar algunos comandos artesanales desde la web. Está lejos de ser perfecto, pero puede funcionar para algunos casos de uso.

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

Ben Yanke
fuente
0

Creo que el enfoque más eficiente para esto es usar el módulo de trabajo cron en el panel de administración del servidor compartido para ejecutar el comando del planificador laravel que a su vez llamará al comando artesanal configurado, algo como esto debería hacer el trabajo:

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

Con la configuración del programador en cron, puede editar el método de programación en \ App \ Console \ Kernel.php para llamar al comando artesanal correcto, algo como esto:

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

Siempre puede eliminar las líneas anteriores después de ejecutar los comandos

korwalskiy
fuente