es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Laravel: Problema de caché Redis en segundo plano

Tengo una tarea programada que se ejecuta cada 5 minutos.

Este comando programado agrega algunos datos a la caché de Redis a través del controlador.

Kernel.php


protected $commands = [
Commands\DataCommand::class,
];

protected function schedule(Schedule $schedule)
{
$schedule->command(‘data:cache’)->everyFiveMinutes()->onOneServer()->runInBackground();
}

DataCommand.php

php

public function handle()
{
app(‘App\Http\Controllers\DataProcessing’)->setCache();
}

DataProcessing.php

php

public function setCache()
{
$data = [‘one’, ‘two’, ‘three’];
Cache::store(‘redis’)->put(‘data’, $data, now()->addMinutes(10));
}

Esto no funciona con ‘runInBackground’. Cuando intento obtener ‘data’ de la caché, devuelve ‘null’ de todos modos.

Entonces, cuando elimino ‘-> runInBackground()’, funciona perfectamente y luego puedo obtener ‘data’ de la caché de Redis como se esperaba.

El problema es que se ejecuta secuencialmente en primer plano, pero quiero ejecutar todas las tareas programadas simultáneamente en segundo plano.

¿Por qué no puedo acceder a la caché cuando la tarea se está ejecutando en segundo plano y cómo solucionar este problema?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Cuando la tarea se está ejecutando en segundo plano con runInBackground(), se crea un nuevo proceso y se ejecuta por separado del proceso principal. Esto significa que el comando no puede acceder al caché de Redis porque está utilizando una conexión diferente a Redis.

    Para superar este problema, puede utilizar el método Artisan::call() para ejecutar el comando de manera síncrona dentro del proceso actual. Esto garantizará que el comando tenga acceso al caché de Redis.

    Reemplace la siguiente línea en Kernel.php:

    ->runInBackground();
    

    Con esta línea:

    ->run();
    

    Esto ejecutará el comando de manera sincrónica en primer plano.

    Alternativamente, puede pasar la conexión de Redis al método setCache() en DataProcessing.php. De esta manera, el comando utilizará la misma conexión que el resto de la aplicación, incluso cuando se ejecuta en un proceso separado.

    ...
    use Illuminate\Contracts\Cache\Repository;
    
    public function setCache(Repository $cache)
    {
       $data = ['uno', 'dos', 'tres'];
       $cache->put('datos', $data, now()->addMinutes(10));
    }
    

    Luego, en DataCommand.php, modifique la llamada a setCache() para pasar la conexión en caché:

    ...
    use Illuminate\Support\Facades\Cache;
    
    public function handle()
    {
       app('App\Http\Controllers\DataProcessing')->setCache(Cache::store('redis'));
    }
    

    Esto debería permitir que el comando acceda al caché de Redis incluso cuando se ejecuta en segundo plano.

Comments are closed.