eri*_*hie 4 php queue events notifications laravel-5
当我收到某些通知时,我会触发一个事件。我想要对事件进行排队,以便它们不会同时触发,而是在我收到它们时排队,然后在上一个事件完成后触发。我想知道做到这一点的最佳方法。
编辑:对于将来的任何人来说,设置数据库队列驱动程序都非常简单。您运行 php artisanqueue:table 并将驱动程序更改为“数据库”。我的问题是,由于某种原因,我的应用程序无法识别 .env 文件中的 QUEUE_DRIVER 设置。
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
| 归档时间: |
|
| 查看次数: |
3777 次 |
| 最近记录: |