简介
laravel 的队列服务对各种不同的后台队列服务提供了统一的 API。队列允许你延迟执行消耗时间的任务,这样可以有效的降低请求响应的时间。这里做一个向所有用户发送系统消息的案例。
创建notices
和user_notice
表
php artisan make:migration create_table_notice
public funtion up()
{
Schema::create('notices',function(Blueprint $table){
$table->increments('id');
$table->string('title',50)->default("");
$table->string('content',50)->default("");
$table->timestamps();
});
Schema::create('user_notice',function(Blueprint $table){
$table->increments('id');
$table->integer('user_id')->default(0);
$table->integer('notice_id')->default(0);
});
}
public function down()
{
Schema::dropIfExists('notices');
Schema::dropIfExists('user_notice');
}
php artisan migrate
关联模型
模型User
下多对多关联表user_notice
和notices
//用户收到的通知
public function notices(){
return $this->belongsToMany(Notice:class,'user_notice','user_id','notice_id')
->withPivot(['user_id','notice_id']);
}
//给用户增加通知
public function addNotice($notice){
return $this->notices()->save($notice);
}
修改驱动为database
队列的配置文件被存储在
config/queue.php
中
'default' => env('QUEUE_DRIVER', 'sync'),
修改.env
QUEUE_DRIVER=database
创建database的queue表
php artisan queue:table
php artisan migrate
定义任务SendMessage
php artisan make:job SendMessage
app/Jobs
下会生产相应文件,并定义队列方法
class SendReminderEmail extends Job implements ShouldQueue
{
use Dispatchable,InteractsWithQueue,Queueadble,SerializesModels;
protected $notice; //消息
public function __construct(Notice $notice)
{
$this->notice = $notice;
}
public function handle()
{
//通知每个用户系统消息
$users = User:all();
foreach( $users as $user ){
$user->addNotice($this->notice);
}
}
}
分发任务 dispatch
定义发送系统消息的方法
public function send(){
$notice = Notice::create(request(['title','content']));//接受到消息
dispatch(new \App\Jobs\SendMessage($notice));//消息分发到队列
}
启动队列
php artisan queue:work
nohup php artisan queue:work >> /dev/null & //后台启动(方法)
ps aux|grep queue:work //后台启动(方法2)