laravel 队列任务学习

可使用redis和table做为队列使用,我这里使用了邮件发送队列

使用database

创建表

php artisan queue:table

会创建一张Jobs表的迁移文件

php artisan migrate

执行迁移文件会有报错,
jobs 表queue字段没有设置长度因为他是索引得设置一个长度

$table->string('queue', 100)->index();

使用redis

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

创建任务

生成任务类

php artisan make:job SendEmail

任务类结构

<?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;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;

class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    private $sendInfo = [];

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($sendInfo)
    {
        // 邮件信息
        $this->sendInfo = $sendInfo;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {    
        $content = $this->sendInfo['content'];
        $email = $this->sendInfo['email'];
        Log::info(json_encode($this->sendInfo));

        //$sendResult这里成功后返回的是null,没有办法拿来判断。
        $sendResult = Mail::send('emails.template', ['content' => $content,  'email' => $email], function ($message) use ($email) {
            $message->from(env('MAIL_FROM_ADDRESS'), env('EMAIL_FROM_NAME'))
                ->to($email)
                ->subject(env('EMAIL_TITLE'));
        });
      
    }
}

调用任务类

$interval = 15; //延迟发送, 秒
foreach ($email_arr as $email) {
            //生成邀请码(随机生成六位数字)
            $invitecode = mt_rand(100000, 999999);
            $content = 'Invitation Code 邀请码:' . $invitecode;
            $sendInfo['content'] = $content;
            $sendInfo['email'] = $email;
            //使用数据库做为连接并延迟发送
            SendEmail::dispatch($sendInfo)->onConnection('database')->delay(now()->addSeconds($interval));
        }

可以链式调用 onConnectiononQueue 方法来指定连接和队列。

 SendEmails::dispatch($sendInfo)->onConnection('database')->onQueue('emails')

运行队列任务

指定连接 & 队列

  • 指定连接
php artisan queue:work redis
php artisan queue:work database
  • 指定队列
php artisan queue:work redis --queue=emails
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。