我的 Laravel 设置了一个 MultiSite Middleware Provider,它检查地址的子域,并基于此子域动态更改与另一个数据库的连接。
例如
Config::set('database.connections.mysql.host', $config['host'] );
Config::set('database.connections.mysql.database', $config['db_name'] );
Config::set('database.connections.mysql.username', $config['user']);
Config::set('database.connections.mysql.password', $config['password']);
Config::set('database.connections.mysql.prefix', $config['prefix']);
Config::set('database.connections.mysql.theme', $config['theme']);
// purge main to prevent issues (and potentially speed up connections??)
DB::disconnect('main');
DB::purge();
DB::reconnect();
return $next($request);
这一切都很棒,除了我现在想将 Laravel 队列与内置的数据库驱动程序一起使用(同步实际上工作正常,但会阻碍长报告生成的用户体验)。
除了 Artisan 不确定要连接到哪个数据库,所以我猜它连接到默认数据库,这是一种存储所有子域和相应数据库名称等的主管数据库。
请注意,这些数据库都没有在我的数据库配置中设置为连接,它们存储在一个单一的管理数据库中,因为它们有很多。
我尝试克隆内置的队列侦听器并将其修改为交换到不同的站点连接,如下所示:
/**
* Create a new queue listen command.
*
* @param \Illuminate\Queue\Listener $listener
* @return void
*/
public function __construct(Listener $listener)
{
// multisite swap
$site = MultiSites::where('machine_name', $this->argument('site'));
MultiSites::changeSite($site->id);
parent::__construct();
$this->setOutputHandler($this->listener = $listener);
}
但这失败了
Listener 类缺少 $commandPath 参数。
尝试在 fire() 或 handle() 方法中进行类似的数据库/站点交换会停止 $commandPath 错误,但它什么也不做,没有反馈,也没有开始处理数据库中的任何作业。
我不知道如何让它在多站点环境中工作,有没有人有任何想法或者我在这方面走错路了?
我的理想方案是能够运行一个单一的 Queue 命令,让主管监控它并跳过每个数据库检查。但如有必要,我也愿意为每个数据库/站点生成一个队列命令。