我收到某些通知时会触发一个事件。我想对事件进行排队,以便它们不会同时被解雇但在我收到它们时排队,然后在上一个事件完成后被解雇。我想知道最好的方法。
编辑:对于将来的任何人来说,设置数据库队列驱动程序非常简单明了。你运行php artisan queue:table并将驱动程序更改为'database'。我的问题是我的应用程序由于某种原因没有在我的.env文件中识别出我的QUEUE_DRIVER设置。
答案 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