【发布时间】:2020-03-14 03:16:31
【问题描述】:
我设置了 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 不起作用但控制台命令起作用的原因有什么? 或者有没有更好的方法在所有数据库上动态运行作业,而不是手动运行它们。
【问题讨论】:
标签: php laravel laravel-5 multi-tenant laravel-artisan