code

Laravel: Queueing email

Una forma de mejorar el desempeño de las aplicaciones en Laravel es la optimización del envío de correos electrónicos, para este fin se puede optar por el uso de “queues”.

El término se explica solo, los queues o colas para nuestro caso se utilizarán para ir “almacenando” uno a uno los correos electrónicos que necesitemos enviar, dando la sensación de inmediatez al usuario y permitiéndonos a nosotros procesar dicha cola en segundo plano o en el momento que mejor nos parezca hacerlo.

De acuerdo a la documentación de Laravel (v.5.8) la forma de utilizar queues en el caso del envío de correos electrónicos es de la siguiente manera:

Mail::to($request->user())
    ->cc($moreUsers)
    ->bcc($evenMoreUsers)
    ->queue(new OrderShipped($order));

Desafortunadamente por lo que he visto lo breve de la documentación no ahonda en la sencillez y efectividad de esta solución, por lo que si se continúa leyendo la documentación uno podría llegar a considerar la creación de un Job para implementar esto, cuando no es absolutamente necesario.

De tal suerte que mencionaré brevemente lo que se necesita realizar para hacer que los queues funcionen con el único propósito de enviar correos electrónicos.

  • Crear la migración de la tabla jobs, para esto hay que ejecutar el siguiente comando:

    $ php artisan queue:table

    Dicho comando creará la migración de la tabla “jobs” la cual habrá que migrar usando:

    $ php artisan migrate
  • Una vez teniendo la tabla hay que modificar el driver que utilizaremos para queues, en este caso usaremos el de “database”, con este fin hay que modificar el archivo queue.php debajo del directorio config/ dentro del proyecto y debe verse así:

    'default' => env('QUEUE_DRIVER', 'database'),

    De quedarse utilizando el driver sync, seguirá enviando los correos electrónicos al instante,
  • Con esto ya podemos utilizar el método queue para enviar correos electrónicos e irá creando registros en la tabla “jobs” creando la cola de trabajos.

    Ahora bien para procesar la cola de correos electrónicos a enviar solo necesitamos ejecutar el siguiente comando:

    $ php artisan queue:work

    Al hacerlo se quedará “escuchando” por nuevos trabajos (jobs), en nuestro caso verificando si hay nuevos correos electrónicos para enviar y procesarlos, pero hay una variante del comando que únicamente al llamarlo procesará los trabajos existentes y dejará de ejecutarse, ésta variante es “–stop-when-empty”.

    Con esto en mente solo crearemos una entrada en cron que tenga el siguiente aspecto:

    */2 * * * * cd /home/mi-proyecto && /usr/bin/php -q artisan queue:work –stop-when-empty >> /home/mi-proyecto/email.log

    Así estamos indicando que se ejecute la verificación y procesamiento de trabajos en cola cada dos minutos, bien podría realizarse algo más elaborado colocando esto en un shell script añadiendo incluso un paso de verificación previa para evitar que se traslape mas de un proceso de este tipo.