什么是队列?
队列就是将耗时的任务延迟处理,以减少web请求和响应的时间。
Laravel队列为后台队列提供了统一的API。
什么是队列驱动?
即数据库驱动,redis驱动,Beanstalkd驱动等等。还有一个特殊的驱动:null队列驱动 -- 用于那些放弃队列的任务。
这些驱动的配置,都写在config/queue.php里。
redis队列怎么配置?
config/queue.php中配置redis驱动,config/database.php中配置redis连接信息。
怎么生成任务类?
php artisan make:job ProcessJob
任务类都保存在app/Jobs目录。任务类都会实现Illuminate\Contracts\Queue\ShouldQueue类,以告诉laravel,将任务推送给队列,而不是立即执行。
任务类的结构是什么?
任务类可以包含构造函数,通常只包含一个handle方法,在任务处理时被调用。
怎么分发任务到队列?
通过dispatch方法分发任务,dispatch方法的唯一参数就是任务实例:dispatch(new ProcessJob());
分发任务时,可以指定队列吗?
可以指定队列,也可以指定连接,并且可以在序列中执行队列
指定队列:dispatch(new ProcessJob())->onQueue('processing);
指定连接:dispatch(new ProcessJob())->onConnection('sqs');
任务链:ProcessJob::withChain([new OptimizePodcast,new ReleasePodcast])->dispatch();
还可以延时分发队列:dispatch(new ProcessJob())->delay(now()->addMinutes(10)); //10分钟之后执行
指定最大失败次数和超时时间有几种方法?
指定最大失败次数有三种方法,指定超时时间有两种方法。
指定最大失败次数:
方法一:用artisan命令:php artisan queue:work --tries=3
方法二:定义在任务类中:public $tries=5; //优先级高于artisan命令
方法三:在任务类中添加retryUtil方法, 表示在指定时间内允许任务的最大尝试次数。
public function retryUtil(){
return now()->addSeconds(5);
}
指定超时时间:
方法一:用artisan命令:php artisan queue:work --timeout=30 //最大运行时间30秒
方法二:在任务类中定义超时时间:public $timeout=120; //单位(秒)。优先级高于命令行定义的时间
任务异常时怎么处理?
如果任务在处理过程中有异常抛出,会自动释放回队列,以便再次尝试执行。任务会持续被释放,直到尝试次数达到应用允许的最大次数。
怎么运行队列进程?
Laravel自带了一个队列进程,用来处理被推动到队列中的任务。
运行队列进程的命令:php artisan queue:work
队列进程开始运行后,会持续监听队列,直到手动停止或关闭终端。
队列进程是长生命周期的进程,在启动后会驻留内存。如果应用有改动,是不会影响进程的,要重启队列进程。
supervisor是什么?
supervisor是linux系统中常用的进程守护程序。如果队列进程queue:work意外关闭,它会重新启动队列进程。
网友评论