1:首先我们先使用 Composer 安装依赖:
$ composer require "predis/predis:~1.0"
2:在配置文件中配置默认队列驱动为Redis,队列配置文件是config/queue.php
:
return [ 'default' => env('QUEUE_DRIVER', 'sync'), 'connections' => [ 'sync' => [ 'driver' => 'sync', ], 'database' => [ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', 'expire' => 60, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => 'localhost', 'queue' => 'default', 'ttr' => 60, ], 'sqs' => [ 'driver' => 'sqs', 'key' => 'your-public-key', 'secret' => 'your-secret-key', 'queue' => 'your-queue-url', 'region' => 'us-east-1', ], 'iron' => [ 'driver' => 'iron', 'host' => 'mq-aws-us-east-1.iron.io', 'token' => 'your-token', 'project' => 'your-project-id', 'queue' => 'your-queue-name', 'encrypt' => true, ], 'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'expire' => 60, ], ], 'failed' => [ 'database' => 'mysql', 'table' => 'failed_jobs', ], ];
该配置文件第一个配置项default
用于指定默认的队列驱动,这里我们将其值改为redis
。
3:创建失败进程记录表
$ php artisan queue:failed-table $ php artisan migrate
4:接下来创建任务类
php artisan make:job SendReminderEmail
运行成功后会在app/Jobs
目录下生成一个SendReminderEmail.php
,我们修改其内容如下:
<?php namespace App\Jobs; use App\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Mail\Mailer; use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; class SendReminderEmail implements ShouldQueue { use InteractsWithQueue, Queueable, SerializesModels; protected $user; /** * Create a new job instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * Execute the job. * * @return void */ public function handle(Mailer $mailer) { $user = $this->user; $mailer->send('emails.reminder',['user'=>$user],function($message) use ($user){ $message->to($user->email)->subject('新功能发布'); }); } }
5:下面我们创建邮件局部视图resources/views/emails/reminder.blade.php
:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>test</title> </head> <body> <div class="flex-center position-ref full-height"> 试验成功 </div> </body> </html>
6:在controller里写一个正常的访问请求
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; use Mail; use Storage; use App\User; use App\Jobs\SendReminderEmail; class MailController extends Controller { //其他方法 //发送提醒邮件 public function sendReminderEmail(Request $request,$id){ $user = User::findOrFail($id); $this->dispatch(new SendReminderEmail($user)); } }
route
Route::get('/queued/{id}', 'MailController@sendReminderEmail');
7:开启监听队列
php artisan queue:listen
8:配置发送邮箱
9:打开邮箱的pop,具体可自行百度