【问题标题】:Trouble dispatching Laravel Queue调度 Laravel 队列时遇到问题
【发布时间】:2018-03-15 07:54:32
【问题描述】:

我目前正在尝试使用 Laravel 5.4 中的队列发送邮件,以加快一些请求。但由于某种原因,我就是不会解决。

我的工作如下所示:

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Support\Facades\Mail;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class NotificationEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $doer, $does, $user;

    /**
     * Create a new job instance.
     *
     * @param  Podcast  $podcast
     * @return void
     */
    public function __construct($doer, $does, $user)
    {
        $this->doer = $doer;
        $this->does = $does;
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @param  AudioProcessor  $processor
     * @return void
     */
    public function handle()
    {
        $actions = [
            'accepted.invite' => 'accepted your invited.',
            'accepted.requesting' => 'accepted your request.',
            'denied.invite' => 'denied your invite.',
            'denied.requesting' => 'denied your request'
        ];
        Mail::send('emails.notification', [
            'doer' => $this->does,
            'action' => $actions[$this->action]
        ], function ($m)  {
            $m->from('noreply@bigriss.com', 'Bigriss');

            $m->to("myemail@gmail.com", 'Shawn')->subject('New Notification');

            echo "SENT";
        });
    }
}

通过以下方式将其分派到另一个类中:

NotificationEmail::dispatch($doer, $does, $user);

在侦听队列php artisan queue:listen 后,我一分派作业,侦听器就会无休止地运行,试图解析句柄函数。我收到“已发送”消息,但从未发送过电子邮件(正如我在电子邮件提供商上看到的那样),队列实际上从未被删除,尝试次数只会无限增加。我在这里错过了什么吗?这不是队列的好处吗?

【问题讨论】:

  • 是否有任何日志记录或 try/catch 以确保句柄函数运行时没有任何错误?
  • 我尝试了 try/catch 并且它没有抛出异常。 @JaredChu

标签: php laravel message-queue jobs


【解决方案1】:

您正在将字符串传递给您的 to 函数,而您的闭包中缺少一个变量。

当你有一个匿名函数时,你需要使用use 传递任何额外的变量。我在您的句柄方法中的任何地方都没有看到$user 变量。它需要作为单独的变量传入,因为您不能使用 $this-&gt;user 将其传递到闭包中。

现在你有

$m->to("$user->email", 'Shawn')->subject('New Notification');

这从字面上解释为一个字符串,表示 $user->email 因为你没有传递任何东西。(旁注:这里真的没有理由使用它,保存它带有文件路径等的内联变量。您不需要带有此字符串的内联变量。

您需要将其更改为

$user = $this->user;
Mail::send('emails.notification', [
        'doer' => $this->does,
        'action' => $actions[$this->action]
    ], function ($m) use ($user)  {
        $m->from('noreply@bigriss.com', 'Bigriss');

        $m->to($user->email, 'Shawn')->subject('New Notification');

        echo "SENT";
    });

您可能需要考虑使用Laravel Dusk 之类的东西来调试您的队列,并使用logging 来更好地控制这一点,而不是尝试在浏览器中查看“SENT”。

此外,请考虑清理您的网站地址,因为您要从中发布源代码。

【讨论】:

  • 感谢您的回答。很抱歉造成混淆,但在测试期间,我实际上使用了我的真实电子邮件,而闭包中没有任何变量,因此缺少 use 语句,所以这是真正的问题,但我不太清楚。关于最后一部分,当这不是恶意代码或生产代码时,为什么要清理我的地址?
  • 您的邮件配置是什么?我会尝试使用MailTrap 或类似的东西来开始。就消毒而言,这只是个人实践,您永远不知道将来会遇到什么问题。我可能只是偏执狂:P
  • 我使用 mailgun,当我不只是工作但请求需要一点时间时,它发送邮件非常好
猜你喜欢
  • 2021-07-10
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
  • 2020-06-07
  • 2014-01-11
相关资源
最近更新 更多