Laravel队列作业无法在后台运行

i1icjdpr  于 2023-03-19  发布在  其他
关注(0)|答案(4)|浏览(220)

嘿!我有一个应用程序,我必须发送一些电子邮件在某些行动(如用户创建等)。问题是他们不是在后台运行,而是我必须等待,直到该进程完成,然后它重定向到另一个页面。我使用database驱动程序与queuesLaravel 5.2。我的电子邮件代码,为exp,用户创建后:

$this->dispatch(new WelcomeEmail($user));
Artisan::call('queue:work');

其中WelcomeEmail是推入队列的作业。这种类型的代码放置在我希望发送电子邮件的所有位置。出了什么问题?

wz8daaqr

wz8daaqr1#

首先,您不希望在调度程序中对“queue”命令使用Artisan::call
您应该打开终端并执行:php artisan queue:listen --timeout=0 --tries=1你应该顺其自然。
然后你可以访问你的页面,在那里$this-〉dispatch或者更好的dispatch方法将被调用。
dispatch(new WelcomeEmail($user));
在生产服务器上,应该使用supervisord来监视php artisan queue:listen命令,以确保它始终处于启动和运行状态。
如需进一步阅读,请访问:https://laravel.com/docs/5.2/queues

bxgwgixi

bxgwgixi2#

我不知道为什么更改.env不足以解决此问题,但将此行从
'default' => env('QUEUE_CONNECTION', 'sync'),

config/queue.php file中的'default' => env('QUEUE_CONNECTION', 'database'),一切正常。

ql3eal8s

ql3eal8s3#

我也遇到过类似的问题,但因为是一个单独的任务,我不希望守护进程总是运行,还有更新代码的问题,...所以我解决了直接从PHP运行命令的问题,比如:

exec('nohup php /my_folder/artisan queue:work --once  > /dev/null 2>&1 &');

这将启动一个作业,然后关闭,而不等待结果。但是要小心Laravel日志文件权限,如果您在Linux下运行,oidoss.用户可以根据上下文和配置进行更改。
希望能帮上忙。

ajsxfq5m

ajsxfq5m4#

请移除调度程序中对“queue”命令的Artisan::call。并使用此方法进行调度- dispatchAfterResponse
例如:$this-〉响应后调度(新的欢迎电子邮件($user));

相关问题