php - mail - ¿Cuál es la mejor manera de configurar colas para eventos de Laravel?
laravel queue tutorial (2)
Tengo un evento que se dispara cuando recibo ciertas notificaciones. Quiero poner en cola el evento para que no se activen todos al mismo tiempo, sino que se pongan en cola mientras los recibo y luego se disparan cuando finaliza el evento anterior. Quiero saber la mejor manera de hacer esto.
Editar: Solo para cualquiera en el futuro, configurar la base de datos El controlador de cola es muy sencillo y sencillo. Ejecuta la tabla php artesanal queue: y cambia el controlador a ''base de datos''. Mi problema era que mi aplicación no reconocía mi configuración QUEUE_DRIVER en mi archivo .env por algún motivo.
Laravel hace las colas bastante sencillas, pero un poco largas para explicarlas completamente aquí. Vea estas guías:
Si está utilizando forge, es realmente sencillo: https://mattstauffer.co/blog/laravel-forge-adding-a-queue-worker-with-beanstalkd
Si no está utilizando forge, todavía está bastante bien: http://fideloper.com/ubuntu-beanstalkd-and-laravel4
Laravel 5 tiene su propia forma de lidiar con trabajos en cola, pero aún puede usar las opciones disponibles en Laravel 4. Personalmente he tenido curiosidad sobre cómo funciona todo y simplemente armé un proyecto en blanco y ejecuté un par de puestos de trabajo en cola con un poco de ayuda de los documentos, por lo que esta puede no ser una respuesta completa, pero espero que esto te ayude en tu camino.
Primero querrá configurar su configuración para usar el controlador de cola de la database
, esto se puede hacer en config/queue.php
o para mí fue una cuestión de ir al archivo .env
y hacer esto: QUEUE_DRIVER=database
.
Luego, desea configurar la tabla de la base de datos para que contenga los trabajos en cola, puede hacerlo ejecutando un comando artesanal: php artisan queue:table
esto creará la migración, por lo que debe crear la tabla ejecutando php artisan migrate
y luego Tendrás tu tabla de trabajos en tu DB.
Después de eso, querrá configurar un trabajo en cola que venga en forma de Comandos . Por ejemplo, voy a configurar un trabajo que escriba algo de texto en el archivo de registro. Puede crear trabajos o comandos usando un comando artesanal, esto es lo que hice para crear un comando: php artisan make:command WriteToLog --queued
. Y así es como se ve mi clase de comando después de agregar un pequeño código para que escriba en el archivo de registro ...
aplicación / Comandos / WriteToLog.php
use App/Commands/Command;
use Illuminate/Queue/SerializesModels;
use Illuminate/Queue/InteractsWithQueue;
use Illuminate/Contracts/Bus/SelfHandling;
use Illuminate/Contracts/Queue/ShouldBeQueued;
class WriteToLog extends Command implements SelfHandling, ShouldBeQueued {
use InteractsWithQueue, SerializesModels;
protected $secs;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct($secs)
{
$this->secs = $secs;
}
/**
* Execute the command.
*
* @return void
*/
public function handle()
{
/Log::info(''Writing to the log in '' . $this->secs);
}
}
Después de crear un comando, para probarlo escribí una ruta en mi archivo de rutas ...
aplicación / Http / routes.php
Route::get(''/'', function(){
// some time to delay the job
$fiveSecs = /Carbon/Carbon::now()->addSeconds(5);
$tenSecs = /Carbon/Carbon::now()->addSeconds(10);
// adds job to queue
Queue::later($fiveSecs, new App/Commands/WriteToLog(''5 secs''));
Queue::later($tenSecs, new App/Commands/WriteToLog(''10 secs''));
return ''All done'';
});
Antes de llegar a la ruta, queremos escuchar cualquier trabajo para procesarlos, solo ejecute php artisan queue:listen
luego puede ir a su navegador a la ruta, luego de tocar la ruta en mi navegador, la consola muestra
$ php artisan queue:listen
Processed: Illuminate/Queue/CallQueuedHandler@call
Processed: Illuminate/Queue/CallQueuedHandler@call
Y si reviso mi archivo de registro veo lo siguiente:
[2015-05-19 19:25:08] local.INFO: Writing to the log in 5 secs
[2015-05-19 19:25:10] local.INFO: Writing to the log in 10 secs
¡No exactamente 5 y 10 segundos de diferencia, pero espero que entiendas la idea!
Para mí esto es solo la punta del iceberg y los trabajos en cola son algo muy poderoso en laravel, recomiendo consultar los documentos aquí: http://laravel.com/docs/5.0/queues y aquí: http: // laravel.com/docs/5.0/bus
También puede activar eventos desde sus trabajos en cola o poner en cola un controlador de eventos, consulte aquí para más detalles: http://laravel.com/docs/5.0/events#queued-event-handlers