Laravel消息队列创建与引用
找了很久,也看了很多视频,但都比较散乱。所以总结以下!
关于Laravel的消息队列应用的场景就不多说了,B站的视频都有,接下来就是具体操作。
1.首先需要我们使用redis作为队列的介质,需要在laravel中将redis部署起来。
2.在laravel总目录下的env文件配置添加两行:QUEUE_CONNECTION=redis,
QUEUE_DRIVER=redis。
3.打开终端命令,切换到laravel项目目录下执行指令创建jobs队列
php artisan make:job ‘队列名称’(自己定义)
4.Jobs队列里面引用redis缓存进行事件处理。
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Redis;
class trade implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $data;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($data)
{
//
$this->data=$data;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function (){
info('Lock obtained...');
//处理队列
echo $this->data;
},function (){
//无法获取锁
return $this->release(5);
});
}
}
5.根据上面的Jobs队列代码设置redis处理频率,在处理队列写业务所以。
6.在config/queue文件下面,‘connections’=>[…‘redis’=>[‘driver’ => ‘redis’,
‘connection’ => ‘default’,
‘queue’ => env(‘REDIS_QUEUE’,‘default’),
‘retry_after’ => 90,
‘block_for’=>null,]],
7.创建控制器,php artisan make:controller ‘控制器名称’,在控制器方法中引用队列。
class WebController extends Controller
{
//
public function index(Request $request){
// $v = session('k1');
// return $v.'ooo';
// $v = Redis::get('k1');
// return $v;
// $data = [
// 'tid'=> date('Y-m-d H:i:s').uniqid(),
// 'name'=>'luke',
// 'address'=>'huang'
// ];
//
// $job = new trade($data);
// $job->dispatch($job)->onQueue('trade');
// return '订单的方法';
for($i=0;$i<100;$i++){
trade::dispatch('第'.$i.'个trade线程进入');
echo '第'.$i.'个trade线程进入';
pocess::dispatch('第'.$i.'个Pocess线程进入');
echo '第'.$i.'个pocess线程进入';
}
}
}
8.控制器添加路由,启动项目开始访问。
9.php artisan serve启动项目,php artisan queue:work redis 执行redis队列
10.如果指定了名称php artisan queue:work redis --queue=‘所指定的名称’
相关链接: https://learnku.com/docs/laravel/6.x/queues/5168#e11144
图片: 启动redis队列
如果没有指定单一队列名称,将会存放到默认队列中