php - 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 不起作用但控制台命令起作用的原因有什么?或者有没有更好的方法在所有数据库上动态运行作业,而不是手动运行它们。
解决方案
解决它。使用 exec() 为该租户打开运行 php artisan queue:worker,并安排一个命令来不断检查 processid,它是否仍在运行。
推荐阅读
- javascript - 如何在javascript中解析带有年份字段的cron表达式
- ios - 单击按钮时加载 Tabbarcontroller
- mysql - sql创建表,条件是2列不能具有相等的值
- ios - 我们在哪里声明通知中心对象
- c# - 为什么在使用带有 Udt 和 C# 的 Oracle 存储过程时出现“无效参数绑定”
- compiler-errors - 错误:不是有效的函数参数名称
- python - 无法使用 pop 重命名 Python dict 键值 - 错误?
- caching - Flutter - setState 不使用新数据
- angularjs - 使用 typescript 和 angularjs 获取 document.referrer
- php - 从单选按钮获取值并将其传递给控制器(使用 PHP codeIgniter)