Laravel 队列不作为后台运行

Posted

技术标签:

【中文标题】Laravel 队列不作为后台运行【英文标题】:Laravel Queue doesnt run as background 【发布时间】:2016-04-04 01:48:33 【问题描述】:

嗨,我创建了一个 laravel 队列作业来发送邮件

public function handle() 
    foreach($this->emails as $value) 
            $to         = $value->email;
            $subject    = $this->data['subject'];       
            $this->data['t_firstname']    = $value->firstname;
            $this->data['t_lastname']     = $value->lastname;
            if (view()->exists('mail.requirement_to_tutor')) 
                    $view = view('mail.requirement_to_tutor',$this->data);
                    $html = $view->render();
            
            file_put_contents('test.txt', 'test database');
            $body = $html;
            $headers  = "From: " . $this->data['from'] . "\r\nReply-To: " . $this->data['from'] . "";
            $headers .= "MIME-Version: 1.0\r\n";
            $headers .= "Content-type: text/html; charset: utf8\r\n";
            mail($to, $subject, $body, $headers);
    

我也在从 repo 推送数据

$obj = (new SendStudentRequirement($TutorsbyCity,$data));
$this->dispatch($obj);

但它不作为后台运行,该功能正在等待队列完成,请帮帮我

【问题讨论】:

您是否将队列驱动程序更改为“同步”以外的其他内容? 我关注了 1.php artisan queue:table 2.php artisan make:job SendStudentRequirement --queued 就是这样,我没有触及队列驱动程序和所有 你试过用 Mail::queue 代替 mail() 吗? 邮件队列需要一些第三方邮件发送所以我使用普通邮件 如果您将QUEUE_DRIVER 更改为database,您是否运行php artisan config:cache 来创建新的缓存配置文件? 【参考方案1】:

默认情况下使用 sync 驱动程序。您应该将此更改为config/queue.php中列出的另一个驱动程序

在您的 .env 文件中查找以下行并调整为不同的驱动程序:

QUEUE_DRIVER=sync

Laravel - Docs - Queues

【讨论】:

QUEUE_DRIVER=database 我改成了这个,尽管同样的问题【参考方案2】:

您正在使用"sync" 的默认配置,这意味着所有队列作业将同步运行,而不是“即发即弃”的方式。要更改此默认行为,您可以按照以下步骤操作:

1. 选择不同的队列连接

打开 .env 配置文件并添加 QUEUE_DRIVER 参数以及支持的值之一:“database”、“beanstalkd”、“sqs”或“redis”。在这种情况下,我们将使用 数据库连接 作为示例模式:QUEUE_DRIVER=database

2. 编辑连接驱动

打开/config/queue.php文件并配置你的驱动连接,例如:

'database' => [
            'driver' => 'mongodb',
            'table' => 'jobs',
            'queue' => 'default',
            'retry_after' => 90
        ]

然后运行下面的命令来创建新的jobs 表:

php artisan config:cache && php artisan queue:table

所以,您已经将队列作为“一劳永逸”的方式;你可以试试看jobs表是如何利用队列信息创建的。

3。为长时间运行配置进程管理器

为了将来执行挂起的队列,我们​​可以使用进程管理器supervisor。您可以运行以下命令为 Ubuntu 和 Debian 安装主管:sudo apt-get install supervisor

然后打开主管文件:sudo nano /etc/supervisor/supervisord.conf,并在文件末尾添加如下一行:

[program:laravel-worker-QUEUE_NAME]
process_name=%(program_name)s_%(process_num)02d
command= php /var/www/MY_PROJECT/artisan queue:work --queue=QUEUE_NAME --sleep=15
autostart=true
autorestart=true
user=root
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/MY_PROJECT/storage/logs/worker.log

替换以下值:QUEUE_NAMEMY_PROJECT。请注意,--sleep 参数是验证数据库中新队列的时间(秒)。您可以在official documentation看到更多配置文件的详细信息。

最后执行这些命令来启用程序:

sudo supervisorctl reread && sudo supervisorctl update

您可以在配置的日志文件中查看队列的状态:/var/www/MY_PROJECT/storage/logs/worker.log

【讨论】:

@codiiv, 是否使用队列信息自动创建了作业表? (第 2 步)

以上是关于Laravel 队列不作为后台运行的主要内容,如果未能解决你的问题,请参考以下文章

laravel队列常驻运行问题 queue:

如何在后台 laravel 中运行推送通知循环?

Laravel 队列和 Azure WebJob

Laravel 队列应用

Express 中的 Laravel 队列作业相当于啥?

在后台执行 Laravel/Symfony/Artisan 命令