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

eri*_*hie 4 php queue events notifications laravel-5

当我收到某些通知时,我会触发一个事件。我想要对事件进行排队,以便它们不会同时触发,而是在我收到它们时排队,然后在上一个事件完成后触发。我想知道做到这一点的最佳方法。

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

haa*_*kym 5

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

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

然后您想要设置数据库表来保存排队的作业,您可以通过运行 artisan 命令来完成此操作:php artisan queue:table这将创建迁移,因此您需要通过运行来创建表php artisan migrate,然后您将在其中包含作业表你的数据库。

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

应用程序/命令/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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

应用程序/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';
});
Run Code Online (Sandbox Code Playgroud)

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

$ php artisan queue:listen
Processed: Illuminate\Queue\CallQueuedHandler@call
Processed: Illuminate\Queue\CallQueuedHandler@call
Run Code Online (Sandbox Code Playgroud)

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

[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  
Run Code Online (Sandbox Code Playgroud)

时间间隔不完全是 5 秒和 10 秒,但希望您能明白!

对我来说,这实际上只是冰山一角,排队作业在 Laravel 中非常强大,我强烈建议查看这里的文档:http: //laravel.com/docs/5.0/queues和这里:http:// laravel.com/docs/5.0/bus

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