首页 > 解决方案 > laravel 5.5 电子邮件通知未更新内容

问题描述

<?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

但似乎没有什么对我有用。

这个问题可能与主管有关吗?

标签: phplaravelqueuesupervisordemail-notifications

解决方案


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

这些类发生的任何更改都不会生效,因为工作人员已经加载了旧类。

你可以在 Laravel 文档中阅读:

运行工人部分

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

队列工作者和部署部分

由于队列工作者是长期存在的进程,因此它们不会在不重新启动的情况下获取对代码的更改。因此,使用队列工作者部署应用程序的最简单方法是在部署过程中重新启动工作者。您可以通过发出 queue:restart 命令优雅地重新启动所有工作人员。

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

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

supervisorctl restart all

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

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

这就是存在重新启动队列的工匠命令的原因:

php artisan queue:restart

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

但是,请记住,此命令需要一些时间才能生效,因为它将向所有正在运行的队列工作人员广播重新启动信号,并且队列工作人员只有在完成处理当前作业后才会捕获该信号。那就是所谓的优雅杀戮

要让这个工匠命令工作,请务必为 Laravel 设置适当的缓存驱动程序,因为重启信号是通过缓存广播的。


推荐阅读