laravel 5.5电子邮件通知不更新内容

时间:2018-08-17 12:01:57

标签: php laravel queue supervisor email-notifications

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;

class VerifyEmailNotification extends Notification implements ShouldQueue
{
    use Queueable;

    protected $token;

    /**
    * Create a new notification instance.
    *
    * @return void
    */
    public function __construct($token)
    {
        $this->token = $token;
    }

    /**
    * Get the notification's delivery channels.
    *
    * @param  mixed  $notifiable
    * @return array
    */
    public function via($notifiable)
    {
        return ['mail'];
    }

    /**
    * Get the mail representation of the notification.
    *
    * @param  mixed  $notifiable
    * @return \Illuminate\Notifications\Messages\MailMessage
    */
    public function toMail($notifiable)
    {
        return (new MailMessage)
            ->subject(config('constants.title') . ' - Please Verify Your Email')
            ->line('You are receiving this email because you have sign up on ' . config('constants.title') . '.')
            ->action('Verify Email', url(config('app.url').route('verify_email', ['token' => $this->token], false)))
            ->line('If you did not sign up on ' . config('constants.title') . ', no further action is required.');
    }

    /**
    * Get the array representation of the notification.
    *
    * @param  mixed  $notifiable
    * @return array
    */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

我正在使用laravel 5.5电子邮件通知。我已更改此邮件通知,但已将其缓存。我的应用程序向我发送的邮件包含旧内容,而不是我在此处共享的当前代码段。我正在使用主管来监视队列过程。

我还通过运行以下命令清除了视图缓存,但它确实起作用

php artisan view:clear

我还重新启动了队列

php artisan queue:restart

我也跑过

php artisan config:cache

但对我来说似乎没有任何作用。

此问题可能与主管有关吗?

1 个答案:

答案 0 :(得分:1)

此问题根本与缓存无关。当您运行队列工作器时,所有通知类将被加载一次。

由于工作人员已经加载了旧的类,因此对这些类所做的任何更改都不会生效。

您可以在Laravel文档中阅读以下内容:

Running Worker Section

  

请记住,队列工作器是长期存在的进程,并将启动的应用程序状态存储在内存中。因此,启动它们后,他们将不会注意到代码库中的更改。因此,在部署过程中,请确保重新启动队列工作器。

Queue Workers & Deployment Section

  

由于队列工作器是长期存在的进程,因此如果不重新启动,它们将不会对您的代码进行更改。因此,使用队列工作程序部署应用程序的最简单方法是在部署过程中重新启动工作程序。您可以通过发出queue:restart命令来正常重启所有工作进程。

因此,要更新通知内容,必须杀死所有正在运行的队列工作器并重新启动它们。

此建议的解决方案(因为您正在使用Supervisor)重新启动Supervisor将非常适合您。

supervisorctl restart all

但是,我不建议您这样做,因为重新启动Supervisor会强行杀死您的队列工作者,并且当前处理的工作将会丢失!

编辑:对于Laravel 5.4+,使用Supervisor重新启动命令是安全的,但是请确保将“ stopwaitsecs ”(在工作程序的管理员配置文件中)设置为该值高于估计的作业处理时间。

这就是存在用于重启队列的artisan命令的原因:

php artisan queue:restart

您应该使用此命令来杀死队列工作器,主管将为您重新启动它们。

但是,请记住,此命令生效之前将花费一些时间,因为它将向所有正在运行的队列工作程序广播重新启动信号,并且队列工作程序仅在完成处理当前任务后才捕获该信号。这就是所谓的优雅杀戮

要使此artisan命令正常工作,请确保为Laravel设置适当的缓存驱动程序,因为重启信号是通过缓存广播的。