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?
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
:Con esta línea:
Esto ejecutará el comando de manera sincrónica en primer plano.
Alternativamente, puede pasar la conexión de Redis al método
setCache()
enDataProcessing.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.Luego, en
DataCommand.php
, modifique la llamada asetCache()
para pasar la conexión en caché:Esto debería permitir que el comando acceda al caché de Redis incluso cuando se ejecuta en segundo plano.