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

What is the best way to set up Queues for Laravel Events?

我有一个事件在我收到某些通知时被触发。我想对事件进行排队,这样它们就不会同时全部被触发,而是在我收到它们时排队,然后在前一个事件完成后被触发。我想知道最好的方法。

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

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

如果你用的是forge,真的很无痛: https://mattstauffer.co/blog/laravel-forge-adding-a-queue-worker-with-beanstalkd

如果你不使用 forge,它仍然很不错:http://fideloper.com/ubuntu-beanstalkd-and-laravel4

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

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

然后你想设置数据库table来保存排队的作业,你可以通过运行宁一个artisan命令来做到这一点:php artisan queue:table这将创建迁移,然后您需要通过 运行ning php artisan migrate 创建 table 然后您将在您的数据库中获得作业 table。

之后,您需要设置一个以 Commands 形式出现的排队作业。例如,我将设置一个将一些文本写入日志文件的作业。您可以使用 artisan 命令创建作业或命令,这是我创建命令时所做的:php artisan make:command WriteToLog --queued。这是我的命令 class 在添加了一些代码以使其写入日志文件后的样子...

app/Commands/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);
    }

}

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

app/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';
});

在我们点击路由之前,我们想要监听任何作业以便处理它们,只需 运行 php artisan queue:listen 然后您可以转到浏览器访问路由,点击路由后我的浏览器控制台显示

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

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

[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  

不完全相隔 5 秒和 10 秒,但希望你明白了!

对我来说,这只是冰山一角,排队作业在 laravel 中非常强大,我强烈建议您查看此处的文档:http://laravel.com/docs/5.0/queues and here: http://laravel.com/docs/5.0/bus

您还可以从排队的作业中触发事件或将事件处理程序排队,有关详细信息,请参阅此处:http://laravel.com/docs/5.0/events#queued-event-handlers