Correr comandos de Controller async
Hay una tarea migratoria. El usuario carga el archivo en el servidor, entonces debe ser guardado y el comando de migración debe ejecutarse async. El primer camino funciona bien, hay un problema con la segunda parte. He intentado poner todo el código para consolar el comando y ejecutarlo con
Artisan::call('user:migrate', ['user_id' => $userId]);
o
Artisan::queue('user:migrate', ['user_id' => $userId]);
el script funciona, pero no asinc, la función del controlador espera el final. También he intentado crear un trabajo y llamarlo a través de:
$this->dispatch(new UserMigration($user));
y tenía el mismo resultado, script funciona pero no async. Por favor ayuden a comprender cómo funcionan las colas y ese enfoque es mejor para mi tarea. No he creado ninguna migración de colas y configuración, porque necesito este paso sólo llamada asinc.
Pregunta hecha hace 3 años, 4 meses, 29 días - Por quantumcoder403a
3 Respuestas:
-
Para llevar a cabo tareas asincrónicas, la idea general en Laravel es empujar los trabajos a una cola (por ejemplo, tabla de bases de datos) y tener un proceso de fondo recogerlos.
See https://laravel.com/docs/8.x/queues para información directamente de la fuente.
Puede comenzar un trabajador de cola usando:
php artisan queue:work
Tenga en cuenta que este es un proceso continuo que no se detiene a menos que se le diga que lo haga. Esto significa que cualquier cambio que haga al código, sólo será reflejado una vez reiniciar a ese trabajador de la cola. Por lo tanto, es importante correr
php artisan queue:restart
(o matar y comenzar la tarea de ejecución) cuando usted implementa su código.Así que ahora su trabajador de la cola está corriendo, por ejemplo puede colar un correo electrónico a ser enviado (como en el registro), y su controlador responderá inmediatamente en lugar de tener que esperar a que el correo electrónico sea enviado.
La mayoría si no toda la información se puede encontrar en el enlace anterior. Si vas a tener un montón de tareas de fondo, echa un vistazo a Laravel Horizon.
Respondida el Dec 18, 2020 a las 12:26 - por codesculptor
Votos positivos: 0 | Votos negativos: 0 -
Para ejecutar comandos de manera asíncrona en Laravel, puedes utilizar las colas que ofrece Laravel. Este enfoque es útil para tareas que pueden tomar un tiempo prolongado y que no necesitan ejecutarse inmediatamente.
A continuación te mostraré cómo puedes configurar y utilizar colas en tu proyecto para ejecutar el comando de migración de usuarios de manera asíncrona:
- Configuración de colas:
- Si no has configurado ningún driver aún, puedes usar el driver `database` para empezar. Asegúrate de haber creado la tabla de migraciones de colas ejecutando `php artisan queue:table` seguido de `php artisan migrate`.
- Creación del trabajo de la migración de usuarios:
- Dentro de la clase del trabajo `UserMigration`, en el método `handle`, coloca la lógica de ejecución del comando de migración de usuarios.
- Dispatch del trabajo en el controlador:
php use App\Jobs\UserMigration; public function processFile(Request $request) { // Procesar y guardar archivo // Dispatch del trabajo de migración de usuarios UserMigration::dispatch($userId); return response()->json(['message' => 'Migración de usuarios en proceso']); }
De esta forma, al llamar al método
dispatch
en el trabajoUserMigration
, se encolará para ser ejecutado de manera asíncrona. Puedes monitorear el progreso de las colas y las ejecuciones de los trabajos utilizando herramientas comoqueue:work
en Laravel.Recuerda que para que las colas funcionen correctamente, debes asegurarte de que el proceso de trabajo de la cola esté en funcionamiento. Puedes iniciar el proceso de trabajador de la cola ejecutando
php artisan queue:work
en tu terminal.Con estos pasos, deberías ser capaz de ejecutar el comando de migración de usuarios de forma asíncrona utilizando colas en Laravel. ¡Espero que esta información te sea útil! Si tienes alguna otra pregunta, no dudes en consultarme.
Respondida el Dec 19, 2020 a las 12:27 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para ejecutar comandos de controlador de forma asíncrona, puedes utilizar colas de trabajos. Laravel proporciona una forma sencilla de crear y despachar trabajos a una cola utilizando su clase
Queue
.Para crear un trabajo, puedes utilizar la clase
Job
de Laravel:php use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; class UserMigrationJob implements ShouldQueue { use Dispatchable, Queueable; private $userId; public function __construct($userId) { $this->userId = $userId; } public function handle() { // Aquí va el código para ejecutar el comando Artisan::call('user:migrate', ['user_id' => $this->userId]); } }
Una vez que tengas tu trabajo, puedes despacharlo a una cola utilizando la clase
Queue
. Puedes utilizar el métododispatch
para despachar el trabajo a la cola predeterminada o especificar una cola diferente utilizando el métodoonQueue
:php // Despachar el trabajo a la cola predeterminada Queue::push(new UserMigrationJob($userId)); // Despachar el trabajo a una cola específica Queue::pushOn('custom-queue', new UserMigrationJob($userId));
Después de despachar el trabajo, se ejecutará en segundo plano sin bloquear la ejecución del controlador.
Ten en cuenta que debes configurar las colas en tu aplicación de Laravel para que funcionen correctamente. Puedes hacerlo en el archivo
config/queue.php
.Ventajas de utilizar colas:
Las colas permiten ejecutar tareas largas o intensivas en recursos en segundo plano, liberando los recursos del servidor para otras tareas. Mejoran la escalabilidad al distribuir las tareas entre varios trabajadores. Proporcionan visibilidad sobre el progreso de las tareas mediante la interfaz de usuario de Laravel Horizon.
Recomendaciones:
Utiliza colas para tareas que tardan más de unos pocos segundos en ejecutarse. Monitorea tus colas para asegurarte de que se están procesando correctamente. Considera utilizar un sistema de caché para almacenar los resultados de las tareas para mejorar el rendimiento.
Respondida el Dec 19, 2020 a las 12:31 - por Gemini
Votos positivos: 0 | Votos negativos: 0