为Laravel Events设置队列的最佳方法是什么?

时间:2015-05-19 16:25:27

标签: php events notifications queue laravel-5

我收到某些通知时会触发一个事件。我想对事件进行排队,以便它们不会同时被解雇但在我收到它们时排队,然后在上一个事件完成后被解雇。我想知道最好的方法。

编辑:对于将来的任何人来说,设置数据库队列驱动程序非常简单明了。你运行php artisan queue:table并将驱动程序更改为'database'。我的问题是我的应用程序由于某种原因没有在我的.env文件中识别出我的QUEUE_DRIVER设置。

2 个答案:

答案 0 :(得分:3)

Laravel 5有自己处理排队作业的方式,但你仍然可以使用Laravel 4中提供的选项。我个人很好奇它是如何工作的,只是扔了这是一个空白的项目,并在文档的帮助下运行了几个排队的工作,所以这可能不是一个完整的答案,但我希望这可以帮助你。

首先,您需要将配置设置为使用database队列驱动程序,这可以在config/queue.php中完成,或者对我来说,这是转到.env文件的问题,这样做:QUEUE_DRIVER=database

然后,您希望设置数据库表以保存排队的作业,您可以通过运行artisan命令来执行此操作:php artisan queue:table这将创建迁移,因此您需要通过运行{{{}创建表。 1}}然后你的数据库中就会有你的工作表。

在此之后,您将要设置以命令形式的排队作业。例如,我将设置一个将一些文本写入日志文件的作业。您可以使用artisan命令创建作业或命令,这是我创建命令时所做的:php artisan migrate。这是我的命令类在添加一些代码以使其写入日志文件之后的样子......

应用/命令/ WriteToLog.php     

php artisan make:command WriteToLog --queued

创建命令后,为了测试它,我在路线文件中写了一条路线...

应用/ HTTP / routes.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);
    }

}

在我们点击路线之前,我们想要监听任何工作以便处理它们,只需运行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'; }); 然后你可以到浏览器访问路线,在我的浏览器中点击路径后控制台显示< / p>

php artisan queue:listen

如果我检查我的日志文件,我会看到以下内容:

$ php artisan queue:listen
Processed: Illuminate\Queue\CallQueuedHandler@call
Processed: Illuminate\Queue\CallQueuedHandler@call

相距不超过5秒和10秒,但希望你明白了!

对我而言,这真的只是冰山一角,排队的工作在laravel中是非常强大的,我强烈建议在这里查看文档:{​​{3}}和这里:http://laravel.com/docs/5.0/queues

您还可以从排队的作业中激活事件或对事件处理程序进行排队,有关详细信息,请参阅此处:http://laravel.com/docs/5.0/bus

答案 1 :(得分:1)

Laravel使得队列非常简单,但有点长,在这里完全解释。看看这些指南:

如果你正在使用锻造,它真的很无痛: https://mattstauffer.co/blog/laravel-forge-adding-a-queue-worker-with-beanstalkd

如果你没有使用伪造,它仍然可以:http://fideloper.com/ubuntu-beanstalkd-and-laravel4