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:
    - Abre tu archivo de configuración `config/queue.php` y asegúrate de tener configurado el driver de cola que deseas usar (puedes elegir entre `sync`, `database`, `redis`, `beanstalkd`, etc.).
    • 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:
    - Crea un nuevo trabajo de Laravel para la migración de usuarios. Puedes generar uno nuevo usando el comando `php artisan make:job UserMigration`.
    • 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:
    - En tu controlador donde se carga y guarda el archivo, ejecuta el trabajo de la migración de usuarios de la siguiente manera:

    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 trabajo UserMigration, se encolará para ser ejecutado de manera asíncrona. Puedes monitorear el progreso de las colas y las ejecuciones de los trabajos utilizando herramientas como queue: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étodo dispatch para despachar el trabajo a la cola predeterminada o especificar una cola diferente utilizando el método onQueue:

    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