码迷,mamicode.com
首页 > 其他好文 > 详细

laravel1队列

时间:2017-12-10 22:50:20      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:次数   github   end   目录   const   -name   脚本   睡眠   移动   

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()

    {

        //

    }

}

 

 

 

 

laravel1队列

标签:次数   github   end   目录   const   -name   脚本   睡眠   移动   

原文地址:http://www.cnblogs.com/keiweila/p/8018239.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!