在处理耗时任务时,如果直接等待可能会影响整体的运行效率,故而使用队列,待执行完成之后再处理。
队列驱动
支持: 数据库、Redis、Amazon SQS、Beanstalkd
修改队列驱动:/.env 文件中
QUEUE_CONNECTION=database
创建队列数据表
php artisan queue:table
php artisan migrate
在/config/database.php 中,配置 redis 服务
队列任务
生成任务
php artisan make:job MyJob
文件如下
<?php
namespace App\Jobs;
use ...
class MyJob implements ShouldQueue{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $data;
public function __construct(Data $data){
$this->data = $data;
}
//实现该方法
public function handle(MyProcessor $processor){
}
}
唯一任务
<?php
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Queue\ShouldBeUnique;
class UpdateSearchIndex implements ShouldQueue, ShouldBeUnique{
//超时释放唯一锁
public $uniqueFor = 3600;
//用来区分唯一性的内容
public function uniqueId(){
return $this->product->id;
}
}
任务调用
正常调用
MyJob::dispatch($data);
MyJob::dispatchIf($accountActive, $data);
MyJob::dispatchUnless($accountActive, $data);
设优先级
MyJob::dispatch((new Job)->onQueue('high'));
php artisan queue:work --queue=high,low
php artisan queue:work --queue=high,low
同步调用
MyJob::dispatchSync($podcast);
延迟调用
MyJob::dispatch($data)->delay(now()->addMinutes(10));
MyJob::dispatchAfterResponse(); //响应发回客户端时调用