13.队列
队列分发
1.// 这个任务将被分发到默认队列...
Job::dispatch();
// 这个任务将被发送到「emails」队列...
Job::dispatch()->onQueue('emails');
队列驱动设置
1.Redis集群驱动设置key hash tag???
- retry_after 与block_for???
创建任务
1.生成任务类:php artisan make:job ProcessPodcast
2.任务类的结构很简单,一般来说只会包含一个让队列用来调用此任务的 handle 方法.
3.任务中间件
<?php
namespace App\Jobs\Middleware;
use Illuminate\Support\Facades\Redis;
class RateLimited
{
/**
* 处理队列中的任务.
* @param mixed $job
* @param callable $next
* @return mixed
*/
public function handle($job, $next)
{
Redis::throttle('key')
->block(0)->allow(1)->every(5)
->then(function () use ($job, $next) {
// 锁定…
$next($job);
}, function () use ($job) {
// 无法获取锁…
$job->release(5);
});
}
}
分发任务
1.一旦你写完了你的任务类你就可以使用它自带的 dispatch 方法分发它。传递给 dispatch 方法的参数将会被传递给任务的构造函数ProcessPodcast::dispatch($podcast)
2.延时分发delay()
class PodcastController extends Controller
{
/**
* 存储一个新的播客节目.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// 创建播客...
ProcessPodcast::dispatch($podcast)
->delay(now()->addMinutes(10));
}
}
3.同步调度dispatchNow()
4.任务链
任务链允许你具体定义一个按序列执行队列任务的列表。一旦序列中的任务失败了,剩余的工作将不会执行。要运行一个任务链,你可以对可分发的任务使用 withChain(),使用 $this->delete() 方法删除队列任务不会阻止任务链任务执行。
5.连接和队列
如果你想定义用于任务链的默认连接和队列,你可以使用 allOnConnection 和 allOnQueue 方法。(config都配置过连接了!???)
6.自定义连接和队列
如果你在多队列连接中工作,你可以指定将任务分发到哪个连接。要指定连接,在分发任务时使用 onConnection() 方法。(使用场景???)
7.指定任务最大尝试量
php artisan queue:work --tries=3
可以在任务类中指定属性 public $tries = 5;(任务类中的设定高于命令行)
运行队列处理器
1.它会一直运行直到它被手动停止或终端被关闭.记住,队列处理器是一个常驻的进程并且在内存中保存着已经启动的应用状态。因此,它们并不会在启动后注意到你代码的更改。所以,在你的重新部署过程中,请记得 重启你的队列处理器。
php artisan queue:work
2.包括单一任务执行--once;处理所有队列的任务然后退出--stop-when-empty
3.队列的优先级(要运行一个处理器来确认 low 队列中的任务在全部的 high 队列任务完成后才继续执行,你可以传递一个逗号分隔的队列名列表作为 work 命令的参数)
php artisan queue:work --queue=high,low