Laravel 队列服务为各种不同的后台队列提供了统一的API。队列配置文件存放在config/queue.php
包括数据库、Beanstalkd、 IronMQ、 Amazon SQS、 Redis以及同步(本地使用)驱动。其中还包含了一个null队列驱动以拒绝队列任务。
1如果是数据库队列,需要生成表
php artisan queue:table
php artisan migrate
如果是Redis,需要 ? Redis: predis/predis ~1.0
2
生成任务类
php artisan make:job SendReminderEmail
该命令将会在app/Jobs目录下生成一个新的类,并且该类实现了Illuminate\Contracts\Queue\ShouldQueue接
在handle方法了吗写逻辑,比如发送邮件
public function __construct(User $user)
{
$this->user = $user;
}
public function handle(Mailer $mailer)
{
$mailer->send(‘emails.reminder‘, [‘user‘ => $this->user], function ($m) { //在列表中发送邮件
//
});
$this->user->reminders()->create(...);
}
3解释
出错
如果任务被处理的时候抛出异常,则该任务将会被自动释放回队列以便再次尝试执行。任务会持续被释放知道尝试次数达到应用允许的最大次数。最大尝试次数通过Artisan任务queue:listen或queue:work上的--tries开关来定义。
手动释放任务
$this->release(10);??
检查尝试运行次数
if ($this->attempts() > 3) {
//
}
4怎么使用队列呀
默认的 Laravel 控制器位于app/Http/Controllers/Controller.php并使用了DispatchesJobs trait。该trait提供了一些允许你方便推送任务到队列的方法,
1
在控制器调用这句 $this->dispatch(new SendReminderEmail($user));
2
在别的地方调用,不是控制器,就调用 use DispatchesJobs;
你也可以使用全局的dispatch方法:
dispatch(new App\Jobs\PerformTask);
5怎么运行队列
php artisan queue:listen
1队列优先级
php artisan queue:listen --queue=high,low////在本例中,high队列上的任务总是在从low队列移动任务之前被处理。
2指定任务超时参数
php artisan queue:listen --timeout=60//你还可以设置每个任务允许运行的最大时间(以秒为单位):
3指定队列睡眠时间
此外,可以指定轮询新任务之前的等待时间(以秒为单位):
php artisan queue:listen --sleep=5
需要注意的是队列只会在队列上没有任务时“睡眠”,如果存在多个有效任务,该队列会持续运行,从不睡眠。
或者另外一个命令:后台队列监听器queue:work
Artisan命令queue:work包含一个--daemon选项来强制队列worker持续处理任务而不必重新启动框架。相较于queue:listen命令该命令对CPU的使用有明显降低:
php artisan queue:work connection --daemon --sleep=3 --tries=3
6添加代码后怎么样重新运行
由于后台队列worker是常驻进程,不重启的话不会应用代码中的更改,所以,最简单的部署后台队列worker的方式是使用部署脚本重启所有worker,你可以通过在部署脚本中包含如下命令重启所有worker:
php artisan queue:restart该命令会告诉所有队列worker在完成当前任务处理后重启以便没有任务被遗漏。
7处理失败的任务
Laravel包含了一个方便的方式来指定任务最大尝试执行次数,任务执行次数达到最大限制后,会被插入到failed_jobs表,失败任务的名字可以通过配置文件config/queue.php来配置。
php artisan queue:failed-table
运行队列监听器的时候,可以在queue:listen命令上使用--tries开关来指定任务最大可尝试执行次数:
php artisan queue:listen connection-name --tries=3
失败任务事件
如果你想要注册一个队列任务失败时被调用的事件,可以使用Queue::failing方法,该事件通过邮件或HipChat通知团队。举个例子,我么可以在Laravel自带的AppServiceProvider中附件一个回调到该事件:
class AppServiceProvider extends ServiceProvider{
/**
* 启动应用服务
*
* @return void
*/
public function boot()
{
Queue::failing(function ($connection, $job, $data) {
// Notify team of failing job...
});
}
/**
* 注册服务提供者
*
* @return void
*/
public function register()
{
//
}
想要更加细粒度的控制,可以在队列任务类上直接定义failed方法,从而允许你在失败发生时执行指定动作:
class SendReminderEmail extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/**
* 执行任务
*
* @param Mailer $mailer
* @return void
*/
public function handle(Mailer $mailer)
{
//
}
/**
* 处理失败任务
*
* @return void
*/
public function failed()
{
// Called when the job is failing...
}
}
8善后
要查看已插入到failed_jobs数据表中的所有失败任务,可以使用Artisan命令queue:failed:
php artisan queue:failed
该命令将会列出任务ID,连接,对列和失败时间,任务ID可用于重试失败任务,例如,要重试一个ID为5的失败任务,要用到下面的命令:
php artisan queue:retry 5
要重试所有失败任务,使用如下命令即可:
php artisan queue:retry all
如果你要删除一个失败任务,可以使用queue:forget命令:
php artisan queue:forget 5
要删除所有失败任务,可以使用queue:flush命令:
php artisan queue:flush
++++++++++++++++++上面是基础,这边是提升
1发送指定的队列,发送到叫emails的队列中
1 $job = (new SendReminderEmail($user))->onQueue(‘emails‘);
$this->dispatch($job);
2 延迟任务
你可能想要将一个注册15分钟后给消费者发送提醒邮件的任务放到队列中,可以通过使用任务类上的delay方法来实现
$job = (new SendReminderEmail($user))->delay(60);
$this->dispatch($job);、、在本例中,我们指定任务在队列中开始执行前延迟60秒。
+++++++++更加提升
任务事件
Queue::after 方法允许你在队列任务执行成功后注册一个要执行的回调函数。在该回调中我们可以添加日志、统计数据
我们可以在Laravel内置的 AppServiceProvider 中添加事件回调:
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Queue::after(function ($connection, $job, $data) {
//
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}