如何为队列创建作业:工作

时间:2017-04-07 20:05:34

标签: php laravel laravel-5

当用户在应用程序中注册时,我有一个发送电子邮件的工作。

SendWelcomeEmail.php

<?php

namespace App\Jobs;

use App\Jobs\Job;
use App\User;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class SendWelcomeEmail extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    protected $user;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle(Mailer $mailer)
    {
        $user = &$this->user;

        $message = sprintf('Hello %s', $user->name);

        $mailer->raw($message, function ($m) use ($user){
            $m->from('lucas.nuck@gmail.com', 'Lucas Lopes');
            $m->to($user->email, $user->name);
        });
    }
}

我想创建一个工作来执行php artisan队列:每分钟工作命令发送队列中的电子邮件。

2 个答案:

答案 0 :(得分:0)

您想要运行队列守护程序,而不是运行命令。您需要在服务器环境中执行此操作,而不是使用laravels计划命令。

您可以使用类似Linux的screen之类的命令来输入命令。

这会毫不费力地轮询您的队列服务器以获取新作业,然后处理它们。

答案 1 :(得分:0)

最简单的方法是设置主管。

https://laravel.com/docs/5.4/queues#supervisor-configuration,如果失败,它会自动重启你的队列:工作流程。

为您解决困惑:

app/Console/Kernel.php文件中,在schedule函数中,您将添加要以特定间隔运行的命令。一个例子是: $schedule->command('SendFailedLoginsReport')->weekly()->mondays()->at('03:00');

在您的服务器上,您可以像这样添加您的cron * * * * * php /path-to-your-project/artisan schedule:run >> /dev/null 2>&1

这个Cron每分钟都会调用Laravel命令调度程序