1. laravel队列配置(配置文件 .env 和 config/queue.php)
优先配置文件 .env 如下:
1 QUEUE_DRIVER=redis2
3 REDIS_HOST=127.0.0.1
4 REDIS_PASSWORD=******
5 REDIS_PORT=6379
当.env 文件没有配置 或者 设置变量为空时,则会按照 config/queue.php 文件的配置信息运行laravel
config/queue.php 文件如下:
1 return[2 ‘default‘ => env(‘QUEUE_DRIVER‘, ‘redis‘),//修改队列驱动,使用redis
3
4 ‘connections‘ =>[5 ‘sync‘ =>[6 ‘driver‘ => ‘sync‘,
7 ],
8
9 ‘database‘ =>[10 ‘driver‘ => ‘database‘,
11 ‘table‘ => ‘jobs‘,
12 ‘queue‘ => ‘default‘,
13 ‘retry_after‘ => 90,
14 ],
15
16 ‘beanstalkd‘ =>[17 ‘driver‘ => ‘beanstalkd‘,
18 ‘host‘ => ‘localhost‘,
19 ‘queue‘ => ‘default‘,
20 ‘retry_after‘ => 90,
21 ],
22
23 ‘sqs‘ =>[24 ‘driver‘ => ‘sqs‘,
25 ‘key‘ => env(‘SQS_KEY‘, ‘your-public-key‘),
26 ‘secret‘ => env(‘SQS_SECRET‘, ‘your-secret-key‘),
27 ‘prefix‘ => env(‘SQS_PREFIX‘, ‘https://sqs.us-east-1.amazonaws.com/your-account-id‘),
28 ‘queue‘ => env(‘SQS_QUEUE‘, ‘your-queue-name‘),
29 ‘region‘ => env(‘SQS_REGION‘, ‘us-east-1‘),
30 ],
31
32 ‘redis‘ =>[33 ‘driver‘ => ‘redis‘,
34 ‘connection‘ => ‘default‘,
35 ‘queue‘ => ‘default‘,
36 ‘retry_after‘ => 90,
37 ‘block_for‘ => null,
38 ],
39 ],
40
41 ‘failed‘ =>[42 ‘database‘ => env(‘DB_CONNECTION‘, ‘mysql‘),
43 ‘table‘ => ‘failed_jobs‘,
44 ],
45 ];
2. 创建队列任务类(app/Jobs/xxx.php)
使用artisan命令 在app/Jobs 目录下创建执行队列任务的类:
php artisan make:job SendEmail
app/Jobs/SendEmailCode.php 代码如下:
1 <?php2
3 namespace App\Jobs;4
5 useIlluminate\Bus\Queueable;6 useIlluminate\Queue\SerializesModels;7 useIlluminate\Queue\InteractsWithQueue;8 useIlluminate\Contracts\Queue\ShouldQueue;9 useIlluminate\Foundation\Bus\Dispatchable;10 use Illuminate\Support\Facades\Mail;11 use App\Models\RecruitUser asUser;12
13 class SendEmail implementsShouldQueue14 {15 use Dispatchable, InteractsWithQueue, Queueable,SerializesModels;16
17 protected $user;18
19 /**20 * Create a new job instance.21 *22 * @return void23 */
24 public function __construct(User $user)25 {26 $this->user = $user;27 }28
29 /**30 * Execute the job.31 *32 * @return void33 */
34 public functionhandle()35 {36 $user = $this->user;37 Mail::raw(‘这里填写邮件的内容‘, function ($message) {38 //发件人(你自己的邮箱和名称)
39 $message->from([email protected], ‘jackie‘);40 //收件人的邮箱地址
41 $message->to($this->user->email);42 //邮件主题
43 $message->subject(‘队列发送邮件‘);44 });45 }46 }
3. 控制器将数据添加到队列中
1 <?php2
3 namespace App\Http\Controllers\Home;4
5 useApp\Jobs\SendEmail;6 useApp\Http\Controllers\Controller;7 useIlluminate\Http\Request;8 use App\Models\RecruitUser asUser;9
10 class MessageController extendsController11 {12 public functionindex()13 {14 $user = User::find(2);15 $res = $this->dispatch(new SendEmail($user));16 dd($res);17 }18
19 }
4. 启动队列
queue:work 默认只执行一次队列请求, 当请求执行完成后就终止;
queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止;
queue:work --daemon 同listen一样,不同的是work不需要再次加载框架,直接运行任务,一般推荐使用这个来处理队列监听。
php artisan queue:restart 重启队列
5. 设置API路由,执行请求,执行队列任务
1 Route::post(‘messageindex‘, [‘uses‘ => $namespaces . [email protected], ‘as‘ => ‘messageIndex‘]);
使用postman发送post请求即可以测试发送邮件队列
查看redis是否有队列数据
查看邮箱发件箱,邮件已发出
6. 使用Supervisor将队列任务启动 添加到守护进程中
推荐安装Supervisor,将 php artisan queue:work —queue sendEmailCode 等一系列队列进程,添加到进程保护中,防止中途崩溃时候,可以自救,哈哈~??
关于Supervisor,可以参考《centos安装Supervisor以及简单配置(添加进程守护)》
总结
laravel队列配置(配置文件 .env 和 config/queue.php)
创建队列任务类(app/Jobs/xxx.php)
控制器将数据添加到队列中
启动队列
设置API路由,执行请求,执行队列任务
使用Supervisor将队列任务启动 添加到守护进程中
原文:https://www.cnblogs.com/clubs/p/11727862.html