laravel队列

作者: 零一间 | 来源:发表于2019-03-15 13:25 被阅读3次

    1 迁移需要的数据表

    配置

    修改.env文件,队列支持"sync", "database", "beanstalkd", "sqs", "redis", "null",这里采用数据库,其他处理方式也都一样。

    
    # mysql数据库
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=test
    DB_USERNAME=root
    DB_PASSWORD=root
    
    # 队列驱动
    QUEUE_DRIVER=database
    

    执行

    # 创建队列作业的表
    php artisan queue:table
    # 迁移数据
    php artisan migrate
    

    2 创建任务类

    php artisan make:job SendEmail
    

    生成文件app/Jobs/SendEmail.php

    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    
    class SendEmail implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct()
        {
            //
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            //
        }
    }
    

    handle 方法为队列处理的具体逻辑,我们这里添加一行日志记录

    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    
    class SendEmail implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $email;
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($email)
        {
            $this->email=$email;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            \Log::info("发送邮件到 -> ".$this->email);
        }
    }
    
    

    3 推送任务

    Controller

    <?php
    
    namespace App\Http\Controllers;
    
    use App\Jobs\SendEmail;
    use Illuminate\Foundation\Bus\DispatchesJobs;
    use Illuminate\Routing\Controller as BaseController;
    use Illuminate\Foundation\Validation\ValidatesRequests;
    use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
    
    class Controller extends BaseController
    {
        use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    
        public function index(){
            dispatch(new SendEmail('xxxx@demo.com'));
            $this->dispatch(new SendEmail('yyyy@demo.com'));
        }
    }
    
    

    route

    <?php
    
    /*
    |--------------------------------------------------------------------------
    | Web Routes
    |--------------------------------------------------------------------------
    |
    | Here is where you can register web routes for your application. These
    | routes are loaded by the RouteServiceProvider within a group which
    | contains the "web" middleware group. Now create something great!
    |
    */
    
    Route::get('/', function () {
        return view('welcome');
    });
    
    Route::get('/index','Controller@index');
    
    

    推送

    curl http://localhost:8084/index

    查看jobs表

    image.png

    4 执行任务

    $ php artisan queue:listen
    [2019-03-15 04:39:24] Processing: App\Jobs\SendEmail
    [2019-03-15 04:39:24] Processed:  App\Jobs\SendEmail
    [2019-03-15 04:39:24] Processing: App\Jobs\SendEmail
    [2019-03-15 04:39:24] Processed:  App\Jobs\SendEmail
    

    查看jobs表,发现任务已经执行完成


    image.png

    指定最大尝试次数和超时时间

    $ php artisan queue:listen --tries=3 --timeout=30``
    

    也可以写到代码里

    <?php
    
    namespace App\Jobs;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    
    class SendEmail implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        /**
         * 任务最大尝试次数。
         *
         * @var int
         */
        public $tries = 3;
    
        /**
         * 任务运行的超时时间。
         *
         * @var int
         */
        public $timeout = 120;
    
    
        protected $email;
        /**
         * Create a new job instance.
         *
         * @return void
         */
        public function __construct($email)
        {
            $this->email=$email;
        }
    
        /**
         * Execute the job.
         *
         * @return void
         */
        public function handle()
        {
            //throw  new \Exception("发生异常");
            /*
            \Mail::raw("队列测试",function ($message){
                $message->to($this->email);
            });
            */
            \Log::info("发送邮件到 -> ".$this->email);
        }
    }
    
    

    5 处理失败任务

    有时候你队列中的任务会失败。不要担心,本来事情就不会一帆风顺。Laravel 内置了一个方便的方式来指定任务重试的最大次数。当任务超出这个重试次数后,它就会被插入到 failed_jobs 数据表里面。要创建 failed_jobs 表的迁移文件,你可以用 queue:failed-table 命令,接着使用 migrate Artisan 命令生成 failed_jobs 表

    # 创建队列作业的表
    php artisan queue:failed-table
    # 迁移数据
    php artisan migrate
    

    查看所有失败任务 php artisan queue:failed

    • ID 任务的 ID (任务 ID 可以被用在重试失败的任务上)
    • Connection 连接
    • Queue 队列
    • Failed At 失败时间
    image.png

    6 失败任务重试

    重试ID 为 24的失败任务,此时会将任务重新放入队列,生成新的ID

    $ php artisan queue:retry 24
    The failed job [24] has been pushed back onto the queue!
    

    重试所有失败的任务使用 all 作为 ID:

     $ php artisan queue:retry all
    The failed job [23] has been pushed back onto the queue!
    The failed job [22] has been pushed back onto the queue!
    The failed job [21] has been pushed back onto the queue!
    The failed job [20] has been pushed back onto the queue!
    The failed job [19] has been pushed back onto the queue!
    The failed job [18] has been pushed back onto the queue!
    The failed job [17] has been pushed back onto the queue!
    The failed job [16] has been pushed back onto the queue!
    The failed job [15] has been pushed back onto the queue!
    The failed job [14] has been pushed back onto the queue!
    The failed job [13] has been pushed back onto the queue!
    The failed job [12] has been pushed back onto the queue!
    The failed job [11] has been pushed back onto the queue!
    The failed job [10] has been pushed back onto the queue!
    The failed job [9] has been pushed back onto the queue!
    The failed job [8] has been pushed back onto the queue!
    The failed job [7] has been pushed back onto the queue!
    The failed job [6] has been pushed back onto the queue!
    The failed job [5] has been pushed back onto the queue!
    The failed job [4] has been pushed back onto the queue!
    The failed job [3] has been pushed back onto the queue!
    The failed job [2] has been pushed back onto the queue!
    The failed job [1] has been pushed back onto the queue!
    

    6 失败任务删除

    删除ID为74的任务

    php artisan queue:forget 74

    image.png

    删除所有失败的任务
    php artisan queue:flush

    image.png

    命令

    queue:failed         列出所有失败的队列
    queue:failed-table   创建失败队列数据表迁移
    queue:flush          清除所有失败的队列作业
    queue:forget         删除失败的队列作业
    queue:listen        监听队列
    queue:restart        重新启动队列工作进程
    queue:retry         重试失败的队列
    queue:table          创建队列数据库表迁移
    queue:work           作为守护程序开始处理队列上的作业
    
    

    queue:listen和queue:work 区别

    • queue:work - 这是新的“守护进程”进程(不再需要该标志)。该框架将启动“一次” - 然后继续循环工作。这将无限期地继续下去。它使用较少的内存/ CPU,queue:listen因为框架在整个时间内保持不变。您还必须记住使用queue:restart强制队列来更新在修补期间推送的任何代码更改。
    • queue:work --once - 这将激活框架,处理一个作业,然后关闭。适用于开发过程中的测试等
    • queue:listen - 这将在每个周期启动框架,处理一个作业,然后完全关闭,然后再次启动框架等,并无限循环。这意味着在处理每个作业后释放所有内存/进程。如果你有内存泄漏queue:work- 尝试一下。

    相关文章

      网友评论

        本文标题:laravel队列

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