我是第一次使用队列,我似乎没有让它工作,laravel似乎没有任何错误.
我正在尝试将用户注册的邮件排队,即应立即将用户重定向到仪表板,并将电子邮件排队.我怎么知道队列是否工作?在点击注册时我必须等待8秒才能看到仪表板,我在注册时收到电子邮件,但队列似乎失败了.
注册时我在mysql作业表上看不到任何队列作业.
php artisan queue:table
php artisan queue:failed-table
php artisan migrate
Run Code Online (Sandbox Code Playgroud)
QUEUE_DRIVER=database
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=dummy@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=hello@example.com
MAIL_FROM_NAME="App name"
Run Code Online (Sandbox Code Playgroud)
在创建函数结束之前 return $user;
dispatch(new NewRegisteredUser($user));
Run Code Online (Sandbox Code Playgroud)
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 Mail;
use App\User;
use App\Mail\RegisteredUserWelcome;
class NewRegisteredUser implements ShouldQueue
{
use Dispatchable, 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()
{
$email = new RegisteredUserWelcome($this->user);
Mail::to($this->user->email)->queue($email);
}
}
Run Code Online (Sandbox Code Playgroud)
namespace App\Mail;
use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class RegisteredUserWelcome extends Mailable
{
use Queueable, SerializesModels;
protected $user;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.registered')
->with([
'firstname' => $this->user->firstname,
'lastname' => $this->user->lastname,
]);
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?我没有收到错误并且发送了邮件,但在mysql中没有观察到队列作业,注册时间很长.
我也很困惑这个:https://laravel.com/docs/5.4/mail#queueing-mail符合这个https://laravel.com/docs/5.4/queues为什么我们已经有了单独的队列在邮件排队?
我应该使用什么以及如何使用?我需要做的就是减少用户的等待时间并在场景后发送邮件.此外,我在某些情况下发送多封电子邮件.我想如果我排队多个电子邮件的工作,这将有所帮助.
我使用markdown作为邮件模板
我让队列工作,输出就可以了php artisan queue:listen.
问题是.env文件没有明确缓存.php artisan config:clear让它发挥作用.通过简单地延迟工作,可以使队列更有效率.
我把工作推迟了60秒(1分钟),事情很顺利.
我将发布我必须创建的所有代码和文件以使其工作.
设置.env文件
QUEUE_DRIVER=database
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=dummy@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION="tls or ssl" (double quotes not required)
MAIL_FROM_ADDRESS="email address to be shown to email receiver" (double quotes not required)
MAIL_FROM_NAME="App Name" (double quotes not required only if you have blank space between the name)
Run Code Online (Sandbox Code Playgroud)
这行代码确保考虑.env文件中的新值
php artisan config:clear
Run Code Online (Sandbox Code Playgroud)
在我的Controller文件中
use Mail;
use App\Jobs\NewprofileCreated;
use App\Mail\ProfileCreated;
Run Code Online (Sandbox Code Playgroud)
控制器代码
dispatch((new NewprofileCreated($user))->delay(60));
Run Code Online (Sandbox Code Playgroud)
使用以下命令创建的两个文件
php artisan make:job NewprofileCreated
php artisan make:mail ProfileCreated
Run Code Online (Sandbox Code Playgroud)
NewprofileCreated作业文件
use Mail;
use App\User;
use App\Mail\ProfileCreated;
class NewprofileCreated implements ShouldQueue
{
use Dispatchable, 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()
{
$email = new ProfileCreated($this->user);
Mail::to($this->user->email)->queue($email);
}
}
Run Code Online (Sandbox Code Playgroud)
ProfileCreated邮件文件
class ProfileCreated extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->markdown('emails.profile_created');
}
}
Run Code Online (Sandbox Code Playgroud)
profile_created markdown template(文件夹:view/emails/profile_created)
@component('mail::message')
<h1>Your new profile is created</h1>
You have received this email because your profile was created for {{ config('app.name') }}
Thanks,<br>
{{ config('app.name') }}
@endcomponent
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2683 次 |
| 最近记录: |