可使用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
任务类结构
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));
}
可以链式调用 onConnection 和 onQueue 方法来指定连接和队列。
SendEmails::dispatch($sendInfo)->onConnection('database')->onQueue('emails')
运行队列任务
指定连接 & 队列
指定连接
php artisan queue:work redis
php artisan queue:work database
指定队列
php artisan queue:work redis --queue=emails