首页 > 解决方案 > Laravel Multi Tenancy Queue Worker - 在命令行中工作但不是 Artisan:call

问题描述

我设置了 Laravel 多租户,因此每个租户都有自己的数据库,其中包含作业/失败作业表,以及一个包含租户列表及其数据库名称的默认数据库。(当用户注册时,他们会获得自己的数据库)。

我正在尝试创建一种使用 queue:worker 在每个租户数据库中运行所有作业的方法。目前我能想到的最好的事情是创建一个调度程序,它将每分钟检查默认数据库中的所有租户,然后使用该租户数据库名称调度一个作业。然后,该作业被另一个队列工作人员接手,将数据库连接交换到正确的数据库,然后我尝试运行 artisan 命令:

php artisan queue:work --stop-when-empty --tries=1

当我在控制台中运行此命令时,它可以完美运行,并且可以处理所有租户数据库上的作业。

但是,当我在 Job 中使用 Artisan 启动以下命令时:

Artisan::call('queue:work', ['--stop-when-empty' => true, '--timeout' => 30, '--tries' => 1]);

该作业总是超时并且不会在租户数据库中获取任何作业。

我动态设置数据库连接的方式如下:

\Config::set('database.connections.tenant.database','tenant_1');
\DB::purge('tenant');
\Config::set('queue.connections.database.connection','tenant');

Artisan:call 不起作用但控制台命令起作用的原因有什么?或者有没有更好的方法在所有数据库上动态运行作业,而不是手动运行它们。

标签: phplaravellaravel-5multi-tenantlaravel-artisan

解决方案


解决它。使用 exec() 为该租户打开运行 php artisan queue:worker,并安排一个命令来不断检查 processid,它是否仍在运行。


推荐阅读