Laravel 5.5 邮件通知未更新内容。

12
<?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 的电子邮件通知功能。我已更改了此邮件通知,但某些地方它被缓存了。我的应用程序向我发送带有旧内容的邮件,而不是我在这里分享的当前代码片段。我正在使用 supervisor 监控队列进程。

我已经运行以下命令清除视图缓存,但它并没有起作用。

php artisan view:clear

我也重新启动了队列

php artisan queue:restart

我也曾经跑过

php artisan config:cache

但是似乎没有什么方法对我有效。

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


你是在Homestead上运行你的代码吗? - IlGala
我正在专用服务器上运行我的代码。 - faizan.sh
1
也许停止你的工作进程,清除缓存,重启工作进程会有所帮助。我甚至建议您也重启监控服务。 - Tschitsch
我刚刚停止了Supervisor并重新启动了它。谢谢,这对我有用。sudo supervisorctl stop allsudo supervisorctl restart all - faizan.sh
@Tschitsch 把它发布为答案,这样我就可以标记它为已接受。谢谢。 - faizan.sh
显示剩余2条评论
1个回答

13

这个问题与缓存无关。当您运行队列worker时,所有通知类只会被加载一次。

对这些类所做的任何更改都不会生效,因为worker已经加载了旧类。

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

运行Worker部分

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

队列Workers和部署部分

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

因此,要更新通知内容,您必须终止所有运行的队列workers并重新启动它们。

对于您正在使用Supervisor的建议解决方案,重新启动Supervisor将完美地解决此问题。

supervisorctl restart all

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

编辑:使用Supervisor重启命令对于Laravel 5.4+是安全的,但请确保在工作进程的Supervisor配置文件中设置"stopwaitsecs"值大于预计的作业处理时间。

这就是为什么存在重启队列的artisan命令的原因:

php artisan queue:restart
你应该使用这个命令来停止队列工人,Supervisor会重新启动它们。但是,要记住这个命令需要一些时间才能生效,因为它会向所有正在运行的队列工作程序广播重启信号,而队列工作程序只有在处理完当前作业后才会捕获该信号,这就是所谓的“优雅杀死”。为了使这个artisan命令工作,请确保为Laravel设置适当的缓存驱动,因为重启信号是通过缓存广播的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接