美文网首页PHP学习笔记LaravelLaravel开发实践
Laravel框架学习笔记之异步队列

Laravel框架学习笔记之异步队列

作者: 赵客缦胡缨v吴钩霜雪明 | 来源:发表于2018-08-13 05:52 被阅读160次

    当我们在使用laravel框架开发Web项目时,有时会需要异步操作。

    Laravel队列配置文件存放在 config/queue.php。每一种队列驱动的配置都可以在该文件中找到,包括数据库、BeanstalkdAmazon SQSRedis以及同步(本地使用)驱动。其中还包含了一个 null 队列驱动用于那些放弃队列的任务。

    在配置文件 config/queue.php 有一个 connections 配置项。该配置项定义了后台队列服务的特定连接,如 Amazon SQS, Beanstalk, 或 Redis。每种队列连接都可以有很多队列,可以想象在银行办理现金业务的各个窗口队列。

    queue 配置文件中的每个连接配置示例都有一个 queue 属性。当新的队列任务被添加到指定的连接时,该配置项的值就是默认监听的队列(名称)。

    // 以下的任务将被委派到默认队列...

    dispatch(new Job);

    // 以下任务将被委派到 "emails" 队列...

    dispatch((new Job)->onQueue('emails'));

    Laravel 的队列进程支持通过优先级指定处理的队列。可以将高优先级的任务委派到high(高优先级)队列,从而让它优先执行。

    示例 php artisan queue:work --queue=high,default

    我们常用的队列驱动有两个:数据库和Redis

    1.数据库。要使用 database 队列驱动,需要数据表(jobs)保存任务信息

    2.Redis。要使用 redis 队列驱动,需要在配置文件 config/database.php 中配置 Redis 数据库连接。

    一.创建异步任务

    因为该任务使用了 SerializesModels trait,Eloquent 模型将会在任务被执行时优雅地序列化和反序列化。如果你的队列任务在构造函数中接收Eloquent 模型,只有模型的主键会被序列化到队列,当任务真正被执行的时候,队列系统会自动从数据库中获取整个模型实例。这对应用而言是完全透明的,从而避免序列化整个 Eloquent 模型实例引起的问题。handle 方法在任务被处理的时候调用。

    二.分发任务

    创建好任务类后,就可以通过辅助函数 dispatch 将其分发到队列。

    三.运行队列进程

    Laravel 包含了一个队列进程用来处理被推送到队列的新任务。使用 queue:work 命令运行队列进程。请注意,队列进程开始运行后,会持续监听队列,直至你手动停止或关闭终端:

    php artisan queue:work

    指定最大失败次数/超时时间

    最大失败次数

    指定队列任务最大失败次数的一种实现方式是通过 Artisan 命令 --tries 切换:

    php artisan queue:work --tries=3

    超时

    类似的,队列任务最大运行时长(秒)可以通过 Artisan 命令 --timeout 来指定:

    php artisan queue:work --timeout=30

    进行休眠时间

    当任务在队列中有效时,进程会持续处理任务,没有延迟。不过,我们可以使用 sleep 配置项来指定没有新的有效任务产生时的休眠时间:

    php artisan queue:work --sleep=3

    配置Supervisor

    当项目部署到linux 服务器上时,我们需要使用Supervisor来保证异步队列进程的正常运行。Supervisor 是 Linux 系统中常用的进程守护程序。如果队列进程 queue:work 意外关闭,它会自动重启启动队列进程。

    安装好Supervisor之后,Supervisor 配置文件通常存放在 /etc/supervisor/conf.d 目录,可以创建多个配置文件指示 Supervisor 监视进程。例如,创建一个开启并监视queue:work 进程的 laravel-worker.conf 文件:

    启动Supervisor

    创建配置文件成功后,需要刷新 Supervisor 的配置信息并使用如下命令启动进程:

    sudo supervisorctl reread

    sudo supervisorctl update

    sudo supervisorctl start laravel-worker:*

    这样,异步队列任务就可以持续运行了。

    处理失败的任务

    不可避免会出现失败的任务。Laravel 设置任务允许的最大尝试次数,若是执行次数达到该限定,任务会被插入到 failed_jobs 表。

    运行队列进程时,通过 --tries 参数项来设置队列任务允许的最大尝试次数,如果没有指定 --tries 选项的值,任务会被无限期重试:

    php artisan queue:work redis --tries=3

    重试失败的任务

    要查看已插入到 failed_jobs 数据表中的所有失败任务,可以使用 Artisan 命 :

    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

    相关文章

      网友评论

        本文标题:Laravel框架学习笔记之异步队列

        本文链接:https://www.haomeiwen.com/subject/jwllbftx.html