【问题标题】:php artisan queue:work or listen not working Laravel 5.4php artisan queue:工作或收听不工作 Laravel 5.4
【发布时间】:2018-10-20 16:20:03
【问题描述】:

我已经安装了 laravel 5.4 并想确认用户注册,通过带有队列的电子邮件,成功创建作业表,数据也插入到表用户中,但是当我运行 PHP 工匠队列时它什么也没输出:工作 命令。 我的 gmail 邮箱什么也没收到 我花了很多时间来解决它,但仍然没有工作。任何帮助将不胜感激,非常感谢。

Jobs/SendVerificationEmail 类:

    class SendVerificationEmail implements ShouldQueue
{
  protected $user;

    public function __construct($user)
    {
        $this->user = $user;
    }

    public function handle()
    {
        $data = ['email_token' => $this->user->email_token];

        Mail::send('email.email', $data, function($message) {
            $message->subject('This mail send by Queue Laravel 5.4');
            $message->to($this->user->email);
        });
    }
}

Contoller/RegistrationController 类:

 class RegistrationController extends Controller
{
    public function create()
    {
        return view('register');
    }

    public function register(Request $request)
    {
        //create user
        $user = new User;
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->email_token = base64_encode($request->email);

        $user->save();
        dispatch(new SendVerificationEmail($user));

        return view('verification');

        //add role by default the new registred saved as a User Role
        $user->roles()->attach(Role::where('name', 'User')->first());

        // redirect
        //return redirect('/posts');

        //login
        auth()->login($user);

    }
    public function verify($token)
    {
        $user = User::where('email_token',$token)->first();
        $user->verified = 1;
        if($user->save())
        {
            return view('emailconfirm',['user'=>$user]);
        }
    }
}

【问题讨论】:

  • 你告诉它要处理哪个队列了吗?
  • 代码在哪里?
  • 展示你如何排队作业的示例
  • 我使用队列数据库
  • 您使用的队列名称是什么?它存储在作业表的队列列中。例如,如果您的队列名称是 default,而您的连接是 database,则运行 artisan queue:work database --queue=default 开始处理作业

标签: php laravel-5.4


【解决方案1】:

好吧,如果您在 que:listen 之后没有看到任何内容,并且邮件是通过普通邮件门面发送的 您应该在 .env 中添加以下内容 que_connection=数据库 queue_driver=数据库

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

在您的 SendVerificationEmail 作业的构造函数中设置连接以及您不想使用的队列,例如,

   public function __construct($user)
   {
        $this->queue = 'default'; //choose a queue name
        $this->connection = 'database';
        $this->user = $user;
   }

然后使用 artisan 命令开始处理这些作业

 artisan queue:work database --queue=default

此外,在您的 SendVerificationEmail 作业中,在文件顶部添加行 public $tries = 3;,现在经过此次数的尝试后,作业进入失败的作业队列,您可以检查将其放在那里的异常的内容。

【讨论】:

  • 我尝试了您的建议,它有效,表格作业已填满,但我的邮箱中没有收到任何内容,也没有出现错误
  • @toto01 您的邮件是否设置在 .env 文件中?我会尝试独立测试 Mail::send 以确保它不是配置问题。只需尝试直接从控制器发送邮件,无需任何队列,以确保其设置正确。确保 gmail 不会阻止它们或将它们丢弃在垃圾邮件中。
  • 如果作业正常工作,作业表应该是空的,因为作业在成功运行后会自动删除,或者如果出现任何问题,它们会移动到 failed_jobs 表。
  • 运行命令 php artisan queue:work with "database --queue=emails" 参数帮助了我。谢谢@DaveCarruthers
猜你喜欢
  • 2016-09-07
  • 2017-01-30
  • 2019-08-01
  • 2016-02-07
  • 2015-11-11
  • 2021-01-10
  • 2017-10-25
  • 2017-10-17
  • 1970-01-01
相关资源
最近更新 更多