为 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
我有一个事件在我收到某些通知时被触发。我想对事件进行排队,这样它们就不会同时全部被触发,而是在我收到它们时排队,然后在前一个事件完成后被触发。我想知道最好的方法。
编辑:对于以后的任何人来说,设置数据库队列驱动程序都非常简单明了。您 运行 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